【问题标题】:How to convert Y Cb Cr to RGB in MATLAB manually?如何在 MATLAB 中手动将 Y Cb Cr 转换为 RGB?
【发布时间】:2020-06-09 23:04:32
【问题描述】:

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

【问题讨论】:

  • en.wikipedia.org/wiki/YCbCr 有很多公式,双向。最后两个公式适用于 jpeg(例如,全范围,不改变颜色空间)。

标签: matlab colors rgb subsampling ycbcr


【解决方案1】:

需要将转换公式调整到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 值。

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2013-05-08
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多