YCbCr 转 jpeg-YCbCr

信息处理 JPEG
2022-02-26 04:50:54

我从 ov7670 相机对 YCbCr 中的图像进行采样,并使用 jpegant 库对 jpeg 文件进行编码。每当我直接使用相机中的 Y、Cb、Cr 值进行此操作时,我都会得到一个粉紫色版本的图像。据我在维基百科上了解,有不同的 YCbCr 标准,所以我猜我的相机使用不同的 YCbCr 标准。

由于 Jpegant 库带有一个 RGB 示例,如果我通过提供的示例将我的 YCbCr 值转换为 RGB,然后再将 rgb 转换为 YCbCr(然后是 JPEG),我会得到一个不错的结果。

有没有办法从我的相机 YCbCr(或任何其他 YCbCr 标准)中获取 jpeg-YCbCr?

一个糟糕的img的例子

编辑:

  • 相机以 4:2:2 格式向我发送 YCbCr(这意味着两个连续像素共享相同的 Cb 和 Cr 通道),我继续将它们下采样到 4:2:0 ;

  • 将这些样本编码为 jpeg 并获得粉紫色图像;

  • 我以这种方式将相机 YCbCr 转换为 RGB:

.

R = Y + 1.402 * (Cr - 128) 

G = Y + 1.772 * (Cb - 128)

B = Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr- 128) 

这些值很好,我检查了。然后我使用库示例提供的公式将它们转换回 YCbCr:

Y' = 0.299*R + 0.587*G + 0.114*B 

Cb' = -0.1687*R - 0.3313*G + 0.5*B + 128 

Cr' = 0.5*R - 0.4187*G - 0.0813*B + 128

使用新值,它可以正确编码。

YCbCr 值示例:

前:

156 144 145

后:

177 105 129

1个回答

将您的相机提供的YCbCr样本转换为标准化Y'Cb'Cr'值的矩阵可以由以下 Matlab 代码生成

a = 1.402; b = 1.772; c=-0.34414; d=-0.71414;

M2 = [1 0 a a ; 1 b 0 b; 1 c d (c+d); 0 0 0 -1];

M1 = [0.299 0.587 0.114 0; -0.1687 -0.3313 0.5 1; 0.5 -0.4187 -0.0813 1];

M = M1*M2

您应该提供以下形式的输入向量:

   vin = [Y Cb Cr -128]

然后你的输出将是;

vout = M*vin;

例如vin = [156 144 145 -128]'产生输出:

M*[156 144 145 -128]'

ans =

  177.7573
  105.7629
  129.4807

四舍五入将产生您的预期结果。

M1=[0.2990   0.5870   0.11400.00000.16870.3313   0.50001.00000.50000.41870.08131.0000]

M2=[1.0000.01.4021.4021.0001.7720.0001.7721.0000.344140.714141.05830.0000.0000.0001.000]