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 表示作为输入,但将图像数组转换为浮点表示并一直使用该表示。