我有一个测试jpeg我正在使用一些图像处理代码&我试图获得与python中的opencv和Python中的C和Pillow(通过scipy)相同的uint8值数组,这些值都与我使用gimp打开jpeg时获得的值相匹配。
我尝试将颜色值转换为8位,但这并没有准确地转换这些值 - 看起来有一些我不太了解的四舍五入。我知道gimp和opencv以及Pillow / scipy都使用libjpeg,所以我尝试使用https://github.com/pixiv/go-libjpeg并使用
将图像转换为8位tar zxvf myarchive filea fileb filec
但这仍然不匹配。我怎样才能得到相同的结果?
答案 0 :(得分:1)
JPEG规范没有解码器的像素精确定义,因此不同的实现将具有略微不同的输出。甚至它上面的libjpeg也有4种不同的离散余弦变换实现,使用整数或浮点数学。
至于您的代码,如果img
已经是image.RGBA
,那么这些值都会存储为uint8
,而您只是来回移动这些位无所事事。如果图片是image.YCbCr
,那么您还依赖于颜色转换算法,而YCbCr.RGBA()
方法与color.YCbCrToRGB
函数略有不同。前者试图保持更高的精度,你需要正确地舍入值而不是用简单的右移截断它们。后者更接近规范建议,但没有使用浮点常数,这也可能与其他实现不同。
最后,图像本身可能具有嵌入式ICC配置文件,并且根据用于解码图像的软件,在查看原始像素数据时可能已应用或未应用配置文件。