rgb2gray 的图像值 python
Image values with rgb2gray python
我是图像处理的初学者。
我使用 RGB 图像 image.shape = (4512,3000,3)
我看到第一个像素的值:image[0][0] = [210 213 220]
当我使用 rgb2gray
函数时,结果是 rgb2gray(image[0][0]) = 0.8347733333333334
但是我看到函数使用的关系是Y = 0.2125 * R + 0.7454 * G + 0.0721 * B
。我算了一下,应该是Y = im[0,0,0] * 0.2125 + im[0,0,1] * 0.7154 + im[0,0,2] * 0.0721 = 212.8672
看来我的结果是212.8672/255 = 0.8347733333333334
为什么结果在 0 和 1 之间而不是在 0 和 255 之间?
我假设您使用的是 scikit-image 的 rgb2gray。在这种情况下,您可以在 https://github.com/scikit-image/scikit-image/blob/main/skimage/color/colorconv.py 的代码中看到,颜色模块中的每个颜色转换都以 _prepare_colorarray
方法开始,该方法转换为浮点表示。
def _prepare_colorarray(arr, force_copy=False, *, channel_axis=-1):
"""Check the shape of the array and convert it to
floating point representation.
"""
arr = np.asanyarray(arr)
if arr.shape[channel_axis] != 3:
msg = (f'the input array must have size 3 along `channel_axis`, '
f'got {arr.shape}')
raise ValueError(msg)
float_dtype = _supported_float_type(arr.dtype)
if float_dtype == np.float32:
_func = dtype.img_as_float32
else:
_func = dtype.img_as_float64
return _func(arr, force_copy=force_copy)
该模块确实(谢天谢地)支持 8 位 int 表示作为输入,但将图像数组转换为浮点表示并一直使用该表示。
我是图像处理的初学者。
我使用 RGB 图像 image.shape = (4512,3000,3)
我看到第一个像素的值:image[0][0] = [210 213 220]
当我使用 rgb2gray
函数时,结果是 rgb2gray(image[0][0]) = 0.8347733333333334
但是我看到函数使用的关系是Y = 0.2125 * R + 0.7454 * G + 0.0721 * B
。我算了一下,应该是Y = im[0,0,0] * 0.2125 + im[0,0,1] * 0.7154 + im[0,0,2] * 0.0721 = 212.8672
看来我的结果是212.8672/255 = 0.8347733333333334
为什么结果在 0 和 1 之间而不是在 0 和 255 之间?
我假设您使用的是 scikit-image 的 rgb2gray。在这种情况下,您可以在 https://github.com/scikit-image/scikit-image/blob/main/skimage/color/colorconv.py 的代码中看到,颜色模块中的每个颜色转换都以 _prepare_colorarray
方法开始,该方法转换为浮点表示。
def _prepare_colorarray(arr, force_copy=False, *, channel_axis=-1):
"""Check the shape of the array and convert it to
floating point representation.
"""
arr = np.asanyarray(arr)
if arr.shape[channel_axis] != 3:
msg = (f'the input array must have size 3 along `channel_axis`, '
f'got {arr.shape}')
raise ValueError(msg)
float_dtype = _supported_float_type(arr.dtype)
if float_dtype == np.float32:
_func = dtype.img_as_float32
else:
_func = dtype.img_as_float64
return _func(arr, force_copy=force_copy)
该模块确实(谢天谢地)支持 8 位 int 表示作为输入,但将图像数组转换为浮点表示并一直使用该表示。