gpt4 book ai didi

rgb - 无损 RGB 到 Y'CbCr 转换

转载 作者:行者123 更新时间:2023-12-01 17:32:31 29 4
gpt4 key购买 nike

我正在尝试无损压缩图像,为了利用规律性,我想将图像从 RGB 转换为 Y'CbCr。 (我所说的 RGB 和 Y'CbCr 的具体细节在这里并不重要;RGB 数据由三个字节组成,我有三个字节来存储结果。)

转换过程本身非常简单,但有一个问题:虽然转换在数学上是可逆的,但实际上会出现舍入误差。当然,这些错误很小并且几乎不易察觉,但这确实意味着该过程不再是无损的。

我的问题是:是否存在一种转换,可以将三个八位整数(代表红色、绿色和蓝色分量)转换为另外三个八位整数(代表类似于 Y'CbCr 的颜色空间,其中两个分量发生变化仅在位置方面略有不同,或者至少小于 RGB 颜色空间),并且可以在不丢失信息的情况下进行反转?

最佳答案

YCoCg24

这是一种我称之为“YCoCg24”的颜色转换,它将三个八位整数(代表红色、绿色和蓝色分量)转换为另外三个八位(有符号)整数(代表类似于 Y'CbCr 的颜色空间) ),并且是双射的(因此可以反转而不会丢失信息):

 G          R          B     Y          Cg         Co
| | | | | |
| |->-(-1)->(+) (+)<-(-/2)<-| |
| | | | | |
| (+)<-(/2)-<-| |->-(+1)->(+) |
| | | | | |
|->-(-1)->(+) | | (+)<-(-/2)<-|
| | | | | |
(+)<-(/2)-<-| | | |->-(+1)->(+)
| | | | | |
Y Cg Co G R B

forward transformation reverse transformation

或伪代码:

function forward_lift( x, y ):
signed int8 diff = ( y - x ) mod 0x100
average = ( x + ( diff >> 1 ) ) mod 0x100
return ( average, diff )

function reverse_lift( average, signed int8 diff ):
x = ( average - ( diff >> 1 ) ) mod 0x100
y = ( x + diff ) mod 0x100
return ( x, y )

function RGB_to_YCoCg24( red, green, blue ):
(temp, Co) = forward_lift( red, blue )
(Y, Cg) = forward_lift( green, temp )
return( Y, Cg, Co)

function YCoCg24_to_RGB( Y, Cg, Co ):
(green, temp) = reverse_lift( Y, Cg )
(red, blue) = reverse_lift( temp, Co)
return( red, green, blue )

一些示例颜色:

color        R G B     Y CoCg24
white 0xFFFFFF 0xFF0000
light grey 0xEFEFEF 0xEF0000
dark grey 0x111111 0x110000
black 0x000000 0x000000

red 0xFF0000 0xFF01FF
lime 0x00FF00 0xFF0001
blue 0x0000FF 0xFFFFFF

G、R-G、B-G 色彩空间

另一种颜色转换,将三个八位整数转换为另外三个八位整数。

function RGB_to_GCbCr( red, green, blue ):
Cb = (blue - green) mod 0x100
Cr = (red - green) mod 0x100
return( green, Cb, Cr)

function GCbCr_to_RGB( Y, Cg, Co ):
blue = (Cb + green) mod 0x100
red = (Cr + green) mod 0x100
return( red, green, blue )

一些示例颜色:

color        R G B     G CbCr
white 0xFFFFFF 0xFF0000
light grey 0xEFEFEF 0xEF0000
dark grey 0x111111 0x110000
black 0x000000 0x000000

评论

好像有不少lossless color space transforms 。Henrique S. Malvar 等人提到了几种无损色彩空间变换。 "Lifting-based reversible color transformations for image compression" ;JPEG XR 中有无损色彩空间转换;几个“lossless JPEG”提案中使用的原始可逆颜色变换(ORCT);G、R-G、B-G 色彩空间;ETC。Malvar 等人似乎对 24 位 RGB 像素的 26 位 YCoCg-R 表示非常兴奋。

但是,几乎所有这些都需要超过 24 位来存储转换后的像素颜色。

我在 YCoCg24 中使用的“lifting”技术与 Malvar 等人中的技术以及 JPEG XR 中的无损色彩空间转换类似。

因为加法是可逆的(并且模 0x100 的加法是双射的),任何从 (a,b) 到 (x,y) 的变换都可以通过以下 Feistel network 生成可逆且双射:

 a        b
| |
|->-F->-(+)
| |
(+)-<-G-<-|
| |
x y

其中(+)表示8位加法(模0x100),a b x y均为8位值,F和G表示任意函数。

详情

为什么只有3个字节来存储结果?这听起来像是适得其反premature optimization 。如果您的目标是在合理的时间内将图像无损压缩为尽可能小的压缩文件,那么中间阶段的大小就无关紧要了。甚至可能会适得其反——“较大”的中间表示(例如可逆颜色变换或 26 位 YCoCg-R)可能会比“较小”的中间表示(例如 RGB 或 YCoCg24)产生更小的最终压缩文件大小。

编辑:糟糕。“(x) mod 0x100”或“(x) & 0xff”之一给出完全相同的结果 -我想要的结果。但不知何故,我把它们混在一起,产生了一些行不通的东西。

关于rgb - 无损 RGB 到 Y'CbCr 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566668/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com