我现在正试图理解JPEG
编码是如何工作的,除了颜色转换部分外,一切似乎都很好。
在DCT
算法中尝试JPEG
之前,图像会转换为YCbCr
色彩空间。对我来说,这实际上意味着我们只是(与初始RGB
图像比较)获取一大块颜色信息并在应用RGB -> YCbCr
转换时处理它。
因此,我们的编码步骤通常看起来像RGB -> YCbCr -> DCT -> Huffman
。解码意味着反转这个过程。
我的问题是 - 尽管我们必须进行逆JPEG
变换,但为什么图像(例如,创建并导出到YCbCr -> RGB
)在颜色方面保持不变。颜色信息的处理部分来自何处或如何处理?
答案 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转换,在这种情况下,信息将丢失,但根据所使用的算法(质量设置),下采样步骤可能是“无”。