我正在尝试使用Scikit-image将图像从RGB转换为XYZ。我发现根据输入类型存在一些差异:
from numpy import array,uint8
import skimage.color
rgb = array([array([[56,79,132],[255,100,70]])])
i1 = skimage.color.rgb2xyz(rgb)#rgb.dtype ->dtype('int32')
i2 = skimage.color.rgb2xyz(rgb.astype(uint8))
i3 = skimage.color.rgb2xyz(rgb.astype(float))
print i1[0,1,:]
print i2[0,1,:]
print i3[0,1,:]
这是输出:
[ 5.55183419e-09 4.73226247e-09 3.02426596e-09]
[ 0.46907236 0.3082294 0.09272133]
[ 240644.54537677 153080.21825017 39214.47581034]
差异的原因是rgb2xyz
中使用的函数img_to_float
(请参阅此问题)。
但是我想知道:使用rgb2xyz
的正确方法是什么?
关于这个问题,有多种解决方案,具体取决于公式,但同样:rgb2xyz
的正确图像类型是什么是必需的?看来unit8
,但是为什么呢?谢谢!
以下代码应该是自我解释的,但是浮点值应该在(0, 1)
中具有范围,并且整数类型的完整范围映射到(0, 1)
(无符号类型)或(-1, 1)
(用于签名类型):
>>> from numpy import int32
>>> skimage.color.rgb2xyz((rgb / 255 * (2**31 - 1)).astype(int32))
array([[[ 0.08590003, 0.08097913, 0.2293394 ],
[ 0.46907236, 0.3082294 , 0.09272133]]])
>>> skimage.color.rgb2xyz(rgb.astype(uint8))
array([[[ 0.08590003, 0.08097913, 0.2293394 ],
[ 0.46907236, 0.3082294 , 0.09272133]]])
>>> skimage.color.rgb2xyz(rgb.astype(float) / 255)
array([[[ 0.08590003, 0.08097913, 0.2293394 ],
[ 0.46907236, 0.3082294 , 0.09272133]]])