【问题标题】:RGB to XYZ in Scikit-ImageScikit-Image 中的 RGB 到 XYZ
【发布时间】:2014-01-29 12:18:42
【问题描述】:

我正在尝试使用 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_floatrgb2xyz 内部使用(请参阅this question)。

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

关于this question,有多种解决方案,具体取决于公式,但同样:rgb2xyz要求的正确图像类型是什么?似乎是unit8,但为什么呢?谢谢!

【问题讨论】:

标签: python image-processing numpy colors scikit-image


【解决方案1】:

以下代码应该是不言自明的,但浮点值的范围应在(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]]])

【讨论】:

  • 谢谢@Jaime!所以你建议正确使用rgb2xyz 是将输入缩放到正确的范围,不是吗?
  • 嗯,正常的用法是让所有东西都是np.uint8,通常的范围是0-255。如果您切换到浮点数,请记住除以 255。除非您知道自己在做什么(以及为什么),否则不要使用其他 int 类型...
  • 如果您使用适当的工具,则无需进行任何手动缩放:img_as_floatimg_as_ubyte 等。
猜你喜欢
  • 2018-08-13
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2018-08-03
  • 2015-06-25
  • 2020-03-16
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多