我正在处理YUV420到RGB的转换,但图像颜色不够好。我的原始文件是10位的,但最初我使用8位的文件。我使用下面的代码读取YUV420图像并将其转换为RGB。因为我有YUV420.YUV图像文件,但该代码用于视频,因此我只读取了1个帧。然后我将YUV作为完整大小的Y读取,而U和V则按照维基百科上的描述缩小了一半。然后,我将图像调整为完整图像的大小并应用YUV到RGB的转换。但RGB图像的颜色不正确。我附上了文件,以便您可以运行并查看问题所在。这是YUV文件 tulips_yuv420_inter_planar_qcif.yuv。
我还有两个问题:
首先,一个帧的“流”大小应该等于Y的大小的1.5倍,但无论我使用uint8还是uint16读取文件,它都非常大。
其次,如果我有10位的YUV420文件,我该如何修改此代码以显示正确的RGB。
我还有两个问题:
首先,一个帧的“流”大小应该等于Y的大小的1.5倍,但无论我使用uint8还是uint16读取文件,它都非常大。
其次,如果我有10位的YUV420文件,我该如何修改此代码以显示正确的RGB。
fname = 'tulips_yuv420_inter_planar_qcif.yuv';
width = 176;
height = 144;
nFrame=1;
fid = fopen(fname,'r'); % Open the video file
stream = fread(fid,'uint8'); % uint16
% stream = fread(fid); % uint8
length = 1.5 * width * height; % Length of a single frame
y = double(zeros(height, width, nFrame));
u = double(zeros(height/2, width/2, nFrame));
v = double(zeros(height/2, width/2, nFrame));
for iFrame = 1:nFrame
frame = stream((iFrame-1)*length+1:iFrame*length);
% Y component of the frame
yImage = reshape(frame(1:width*height), width, height)';
% U component of the frame
uImage = reshape(frame(width*height+1:1.25*width*height), width/2, height/2)';
% V component of the frame
vImage = reshape(frame(1.25*width*height+1:1.5*width*height), width/2, height/2)';
y(:,:,iFrame) = double(yImage);
u(:,:,iFrame) = double(uImage);
v(:,:,iFrame) = double(vImage);
end
u=imresize(u,size(y),'bicubic');
v=imresize(v,size(y),'bicubic');
yuv=cat(3,y,u,v);
T = [1,0,1.28033;1,-0.21482,-0.38059;1,2.12798,0];
RGB(:,:,1) = T(1)*yuv(:,:,1) + T(4)*yuv(:,:,2) + T(7)*yuv(:,:,3) ;
RGB(:,:,2) = T(2)*yuv(:,:,1) + T(5)*yuv(:,:,2) + T(8)*yuv(:,:,3) ;
RGB(:,:,3) = T(3)*yuv(:,:,1) + T(6)*yuv(:,:,2) + T(9)*yuv(:,:,3) ;
figure,imshow(uint8(RGB))
uint16
元素保存在[0, 1023]范围内)。这是相同的非标准交错格式吗?你能给一个样本文件吗? - Rotem