如何将RGB转成YUV整数再还原
how to convert RGB to YUV in interger and then restore
我想把一张RGB图片转成YUV,然后还原。但是当我在MATLAB中计算时,我发现图片与原始图片不太相符。这是我在 matlab 中的操作!
这是我的代码:
%M file
clear all;
clc;
RGB = imread('11111.bmp');
figure;imshow(RGB);
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
Y0= 0.256788*R + 0.504129*G + 0.097906*B + 16;
U0=-0.148223*R - 0.290993*G + 0.439216*B + 128;
V0= 0.439216*R - 0.367788*G - 0.071427*B + 128;
Y= uint8(min(255,max(0,Y0)));% i want 8 bit YUV
U= uint8(min(255,max(0,U0)));
V= uint8(min(255,max(0,V0)));
RGB1R=Y+1.14 *V;
RGB1G=Y-0.39 *U-0.58*V;
RGB1B=Y+2.03*U;
RGB1=cat(3, RGB1R, RGB1G, RGB1B);
figure; imshow(RGB1);
%M file
应该指出图像是胶囊内窥镜 image.you 可以在 wwww.gastrolab.net 中得到它。我想要 YUV 是 8 位整数,有人可以帮助我吗??
为了在 RGB 和 YCbCr 之间进行转换,MATLAB 提供了函数 rgb2ycbcr
and ycbcr2rgb
。 YCbCr 和 YUV 然后通过
相关联
Y = Y
U = 0.872021 Cb
V = 1.229951 Cr
要将 RGB 图像转换为 YUV,您可以使用
RGB = imread('11111.bmp');
YCBCR = rgb2ycbcr(RGB);
YUV(:,:,1) = YCBCR(:,:,1); % Y -> Y
YUV(:,:,2) = 0.872021 * YCBCR(:,:,2); % Cb -> U
YUV(:,:,3) = 1.229951 * YCBCR(:,:,3); % Cr -> V
要将其转换回来,请使用
YCBCR1(:,:,1) = YUV(:,:,1); % Y -> Y
YCBCR1(:,:,2) = YUV(:,:,2) / 0.872021; % U -> Cb
YCBCR1(:,:,3) = YUV(:,:,3) / 1.229951; % V -> Cr
RGB1 = ycbcr2rgb(YCBCR1);
请注意,如果您使用 uint8
作为 RGB
的类型,那么 YCBCR
和 YUV
也将是 uint8
,转换将是有损。对于我的测试图像,RGB
和 RGB1
之间的最大差异是
max(abs(RGB(:)-RGB1(:)))
ans =
4
要进行无损转换,您应该使用 double
数据类型。请注意,MATLAB 假设 uint8
图像的值介于 0 和 255 之间,而对于 double
图像,值介于 0 和 1 之间,因此需要对它们进行缩放。
我想把一张RGB图片转成YUV,然后还原。但是当我在MATLAB中计算时,我发现图片与原始图片不太相符。这是我在 matlab 中的操作! 这是我的代码:
%M file
clear all;
clc;
RGB = imread('11111.bmp');
figure;imshow(RGB);
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
Y0= 0.256788*R + 0.504129*G + 0.097906*B + 16;
U0=-0.148223*R - 0.290993*G + 0.439216*B + 128;
V0= 0.439216*R - 0.367788*G - 0.071427*B + 128;
Y= uint8(min(255,max(0,Y0)));% i want 8 bit YUV
U= uint8(min(255,max(0,U0)));
V= uint8(min(255,max(0,V0)));
RGB1R=Y+1.14 *V;
RGB1G=Y-0.39 *U-0.58*V;
RGB1B=Y+2.03*U;
RGB1=cat(3, RGB1R, RGB1G, RGB1B);
figure; imshow(RGB1);
%M file
应该指出图像是胶囊内窥镜 image.you 可以在 wwww.gastrolab.net 中得到它。我想要 YUV 是 8 位整数,有人可以帮助我吗??
为了在 RGB 和 YCbCr 之间进行转换,MATLAB 提供了函数 rgb2ycbcr
and ycbcr2rgb
。 YCbCr 和 YUV 然后通过
Y = Y
U = 0.872021 Cb
V = 1.229951 Cr
要将 RGB 图像转换为 YUV,您可以使用
RGB = imread('11111.bmp');
YCBCR = rgb2ycbcr(RGB);
YUV(:,:,1) = YCBCR(:,:,1); % Y -> Y
YUV(:,:,2) = 0.872021 * YCBCR(:,:,2); % Cb -> U
YUV(:,:,3) = 1.229951 * YCBCR(:,:,3); % Cr -> V
要将其转换回来,请使用
YCBCR1(:,:,1) = YUV(:,:,1); % Y -> Y
YCBCR1(:,:,2) = YUV(:,:,2) / 0.872021; % U -> Cb
YCBCR1(:,:,3) = YUV(:,:,3) / 1.229951; % V -> Cr
RGB1 = ycbcr2rgb(YCBCR1);
请注意,如果您使用 uint8
作为 RGB
的类型,那么 YCBCR
和 YUV
也将是 uint8
,转换将是有损。对于我的测试图像,RGB
和 RGB1
之间的最大差异是
max(abs(RGB(:)-RGB1(:)))
ans =
4
要进行无损转换,您应该使用 double
数据类型。请注意,MATLAB 假设 uint8
图像的值介于 0 和 255 之间,而对于 double
图像,值介于 0 和 1 之间,因此需要对它们进行缩放。