色彩空间 - RGB和YCbCr问题

时间:2010-05-23 14:54:36

标签: c++ encoding jpeg rgb

我现在正试图理解JPEG编码是如何工作的,除了颜色转换部分外,一切似乎都很好。

DCT算法中尝试JPEG之前,图像会转换为YCbCr色彩空间。对我来说,这实际上意味着我们只是(与初始RGB图像比较)获取一大块颜色信息并在应用RGB -> YCbCr转换时处理它。

因此,我们的编码步骤通常看起来像RGB -> YCbCr -> DCT -> Huffman。解码意味着反转这个过程。

我的问题是 - 尽管我们必须进行逆JPEG变换,但为什么图像(例如,创建并导出到YCbCr -> RGB)在颜色方面保持不变。颜色信息的处理部分来自何处或如何处理?

2 个答案:

答案 0 :(得分:3)

  

对我而言,这基本上意味着我们   只是(与初始RGB图像比较)   拿一大块颜色信息和   在应用RGB时处理它 - >   YCbCr转型。

转换本身不会处理任何信息。这种转变在数学意义上是可逆的。例如。如果将颜色转换为YCbCr并将结果转换回RGB,则会得到相同的颜色。毕竟,在一个完美的世界里。

实际上,信息丢失了。假设您从RGB中的三个字节开始。如果转换为YCbCr,则得到三个值,其中两个,即Cb和Cr不再适合8位。从技术上讲,两个表示RGB和YUV具有不同的色域(http://en.wikipedia.org/wiki/Gamut

幸运的是,这种信息丢失很少见。重要的侧节点:这个色域是不必要的副作用,与首先使用YCbCr的选择无关。

使用YCbCr的意思是,存储在Y中的数据是最重要的。它是亮度或灰度值。 Cb和Cr中的数据是减去亮度的颜色信息。

现在我们的眼睛并不擅长挑选颜色的细微差别,但它们对强度的阴影很敏感。为了在jpeg中使用它,仅存储Cb和Cr的低分辨率图像,并且以全分辨率存储Y.使用最常见的方法可以使用不同的方法来消除x和y中Cb和Cr的每隔一个像素。这将Cb和Cr的空间需求减少了四倍。

  

颜色的处理部分在哪里   信息来自或如何   处理

它不会神奇地回来。信息永远丢失。但是,由于信息开始时并不重要,因此我们看不到太多的文物。

在jpeg中,Cb和Cr窗格的左侧像素通过再次放大Cb和Cr平面来近似。一些解码器只是通过选择一个neigbour来复制丢失的像素,另一些则是线性插值。

答案 1 :(得分:1)

RGB to YCbCr是一个确定的,可逆的数学变换。因此,没有“处置”部分。

换句话说 - RGB像素具有与YCbCr像素相同的信息内容,其方式与“A”相同,“01000001”是仅使用不同编码方案的相同信息的替代表示。

澄清:在{YCbCr - >之间完成chroma downsampling非常常见。 DCT转换,在这种情况下,信息将丢失,但根据所使用的算法(质量设置),下采样步骤可能是“无”。