我的任务是对一系列JPEG执行4:2:0色度子采样(颜色压缩(。
第一步是确保我可以生成Y、Cb和Cr值,然后转换回RGB并显示图像。然后我可以返回并添加我的子采样逻辑。
我确信我有正确的公式来生成Y、Cb和Cr值,但我无法找到返回RGB并打印的正确方法
我们不允许使用任何内置函数(这通常会在帮助解决此问题时显示(。
我附上了我如何获得Y Cb和Cr值的代码,以及我如何尝试返回RGB
目前,在这段摘录之后,我在newImage上运行"imshow"时会看到一个绿色屏幕。
%Obtain R,G,B values
R=double(orig(:,:,1))./255;
G=double(orig(:,:,2))./255;
B=double(orig(:,:,3))./255;
%Calculate Y,Cb, Cr values
Y = (0.299*R) + (0.587*G) + (0.114*B) + 0;
Cb = (-0.168736*R) + (-0.331264*G) + (0.5*B) + 0.5;
Cr = (0.5*R) + (-0.418688*G) - (0.081312*B) + 0.5;
%Calculate new R,G,B
new_R = Y + (1.402*(Cr-128));
new_G = Y-(0.34414*(Cb-128))-(0.71414*(Cr-128));
new_B = Y+(1.772*(Cb-128));
%Fill new Image
newImage(:,:,1) =double(new_R).*255;
newImage(:,:,2) = double(new_G).*255;
newImage(:,:,3) = double(new_B).*255;
其中orig是原始图像,newImage是我在摘录后运行的"imshow"。
您需要根据RGB分量的范围调整转换公式:
- 如果颜色分量范围为[0255],则在将RGB转换为YCbCr时,需要将128添加到Cb,Cr(在转换回时减去128(
- 如果颜色分量范围为[0,1],则需要加(或减(0.5
在您的文章中,您使用范围[0,1]将RGB转换为YCbCr,但您使用的将YCbCr转换回RGB的公式与范围[0255]匹配(您减去128(。
你可以通过减去0.5而不是128来修正它。
示例:
%Sample values for testing (in range [0, 1]):
R = 0.3;
G = 0.6;
B = 0.8;
%Calculate Y,Cb, Cr values
Y = (0.299*R) + (0.587*G) + (0.114*B) + 0;
Cb = (-0.168736*R) + (-0.331264*G) + (0.5*B) + 0.5;
Cr = (0.5*R) + (-0.418688*G) - (0.081312*B) + 0.5;
%Calculate new R,G,B
new_R = Y + (1.402*(Cr-0.5));
new_G = Y-(0.34414*(Cb-0.5))-(0.71414*(Cr-0.5));
new_B = Y+(1.772*(Cb-0.5));
display([new_R, new_G, new_B])
结果:
0.3000 0.6000 0.8000
如您所见,新RGB等于原始RGB值。