我现在正在尝试了解JPEG编码是如何工作的,除了颜色转换部分之外,一切似乎都很好。
在尝试在JPEG算法中进行DCT之前,图像被转换到YCbCr颜色空间。对我来说,这本质上意味着我们(与最初的RGB图像相比)在应用RGB -> YCbCr变换时只需要提取一块颜色信息并对其进行处理。
因此,我们的编码步骤通常类似于RGB -> YCbCr -> DCT -> Huffman。解码意味着颠倒这一过程。
我的问题是-尽管我们必须进行逆YCbCr -> RGB变换,但为什么图像(例如,创建并导出为JPEG)在颜色方面保持不变。颜色信息的处理部分从哪里来,或者是如何处理的?
发布于 2010-05-23 23:44:46
对我来说,这本质上意味着我们(与初始的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平面来近似的。一些解码器只是通过选取邻域来复制丢失的像素,其他的则进行线性插值。
发布于 2010-05-23 23:15:08
RGB to YCbCr是一个确定的、可逆的数学变换。因此,没有“处置”部分。
换句话说- RGB像素与YCbCr像素具有相同的信息内容,就像"A“和"01000001”是相同信息的替代表示,只是编码方案不同。
A澄清:chroma downsampling在YCbCr -> DCT转换之间进行是很常见的,在这种情况下,信息将会丢失,但根据所使用的算法(质量设置),下采样步骤可能是“无”。
https://stackoverflow.com/questions/2892189
复制相似问题