我想将RGB图像转换为yuv420图像,这是我的Matlab代码:
ColorImageRGB = imread('view1.png');
ColorImageYUV = rgb2ycbcr(ColorImageRGB);
[rows cols d] = size(ColorImageRGB);
dims = [cols rows];
dimsUV = uint8(dims / 2);
Yd = zeros(dimsUV);
UVd = zeros(dimsUV);
Y = Yd';
U = UVd';
V = UVd';
Y = uint8(Y);
U = uint8(U);
V = uint8(V);
%sample:420
for i = 1 : rows
for j = 1 : cols
%sample Y in every row
r = ColorImageRGB(i,j,1);
g = ColorImageRGB(i,j,2);
b = ColorImageRGB(i,j,3);
Y(i,j) = 0.299 * r + 0.587 * g + 0.114 * b + 16;
%old line : sample 1/2 U
if mod(i,2) == 1
index_i = uint8(i / 2);
index_j = uint8(j / 2);
U(index_i,index_j) = -0.147 * r - 0.289 * g + 0.436 * b + 128;
end
%even line : sample 1/2 V
if mod(i,2) == 0
index_i = uint8(i / 2);
index_j = uint8(j / 2);
V(index_i,index_j) = 0.615 * r - 0.515 * g - 0.1 * b + 128;
end
end
end
filename = 'view1.yuv';
fid=fopen(filename,'w');
count = fwrite(fid,Y','ubit8');
count = fwrite(fid,U','ubit8');
count = fwrite(fid,V','ubit8');
count = fwrite(fid,Y','ubit8');
count = fwrite(fid,U','ubit8');
count = fwrite(fid,V','ubit8');
fclose(fid);
view1.png:
当我得到yuv图像时,我就这样读了(我试图读取其他yuv图像,这段代码可以正常工作):
[Y U V] = yuv_import('view1.yuv',[cols rows],2);
rgb=yuv2rgb(Y{1},U{1},V{1});
imwrite(rgb,'test.bmp','bmp');
但test.bmp与view1.png不同:
所以,问题是,将rgb图像转换为yuv图像的代码有什么问题?Thx。
答案 0 :(得分:3)
ColorImageRGB = imread('view1.png');
ColorImageYUV = rgb2ycbcr(ColorImageRGB);
[rows cols d] = size(ColorImageRGB);
dims = [cols rows];
dimsUV = uint8(dims / 2);
Yd = zeros(dimsUV);
UVd = zeros(dimsUV);
Y = Yd';
U = UVd';
V = UVd';
Y = uint8(Y);
U = uint8(U);
V = uint8(V);
%sample:420
for i = 1 : rows
for j = 1 : cols
%sample Y in every row
r = ColorImageRGB(i,j,1);
g = ColorImageRGB(i,j,2);
b = ColorImageRGB(i,j,3);
Y(i,j) = 0.299 * r + 0.587 * g + 0.114 * b + 16;
%old line : sample 1/2 U
if mod(i,2) == 1
index_i = uint8(i / 2);
index_j = uint8(j / 2);
U(index_i,index_j) = -0.147 * r - 0.289 * g + 0.436 * b + 128;
end
%even line : sample 1/2 V
if mod(i,2) == 0
index_i = uint8(i / 2);
index_j = uint8(j / 2);
V(index_i,index_j) = 0.615 * r - 0.515 * g - 0.1 * b + 128;
end
end
end
filename = 'view1.yuv';
fid=fopen(filename,'w');
count = fwrite(fid,Y','ubit8');
count = fwrite(fid,U','ubit8');
count = fwrite(fid,V','ubit8');
count = fwrite(fid,Y','ubit8');
count = fwrite(fid,U','ubit8');
count = fwrite(fid,V','ubit8');
fclose(fid);
figure(1);
[Y U V] = yuv_import('view1.yuv',[cols rows],2);
rgb=yuv2rgb(Y{1},U{1},V{1});
imwrite(rgb,'test.bmp','bmp');
a = imread('test.bmp');
subplot(1,2,1);
imshow(a);
ColorImageRGB = double(imread('view1.png'));
ColorImageYUV = rgb2ycbcr(ColorImageRGB);
[rows cols d] = size(ColorImageRGB);
dims = [cols rows];
dimsUV = uint8(dims / 2);
Yd = zeros(dimsUV);
UVd = zeros(dimsUV);
Y = Yd';
U = UVd';
V = UVd';
Y = uint8(Y);
U = uint8(U);
V = uint8(V);
%sample:420
for i = 1 : rows
for j = 1 : cols
%sample Y in every row
r = ColorImageRGB(i,j,1);
g = ColorImageRGB(i,j,2);
b = ColorImageRGB(i,j,3);
Y(i,j) = 0.299 * r + 0.587 * g + 0.114 * b + 16;
%old line : sample 1/2 U
if mod(i,2) == 1
index_i = uint8(i / 2);
index_j = uint8(j / 2);
U(index_i,index_j) = -0.147 * r - 0.289 * g + 0.436 * b + 128;
end
%even line : sample 1/2 V
if mod(i,2) == 0
index_i = uint8(i / 2);
index_j = uint8(j / 2);
V(index_i,index_j) = 0.615 * r - 0.515 * g - 0.1 * b + 128;
end
end
end
filename = 'view1.yuv';
fid=fopen(filename,'w');
count = fwrite(fid,Y','ubit8');
count = fwrite(fid,U','ubit8');
count = fwrite(fid,V','ubit8');
count = fwrite(fid,Y','ubit8');
count = fwrite(fid,U','ubit8');
count = fwrite(fid,V','ubit8');
fclose(fid);
[Y U V] = yuv_import('view1.yuv',[cols rows],2);
rgb=yuv2rgb(Y{1},U{1},V{1});
imwrite(rgb,'test.bmp','bmp');
a = imread('test.bmp');
subplot(1,2,2);
imshow(a);
输出: