1

我的任务是对一系列 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”。

4

1 回答 1

0

您需要将转换公式调整为 RGB 分量的范围:

  • 如果颜色分量范围为 [0, 255],则在将 RGB 转换为 YCbCr 时需要在 Cb、Cr 上加128(在转换回时需要减去 128)。
  • 如果颜色分量范围为 [0, 1],则需要加(或减)0.5

在您的帖子中,您使用范围 [0, 1] 将 RGB 转换为 YCbCr,但是您用于从 YCbCr 转换回 RGB 的公式与范围 [0, 255] 匹配(您减去 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 值。

于 2020-02-27T16:33:26.237 回答