2

我正在尝试使用 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]

差异的原因img_to_float是内部使用的功能rgb2xyz(请参阅this question)。

但我想知道:正确的使用方法是rgb2xyz什么?

关于这个问题,有多种解决方案,具体取决于公式,但同样:所需的正确图像类型是rgb2xyz什么?似乎是unit8,但为什么呢?谢谢!

4

1 回答 1

0

下面的代码应该是不言自明的,但是浮点值应该有一个 in 的范围(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]]])
于 2014-01-29T14:30:57.283 回答