我想,在某些 1D 图像上调用 skimage.color.rgb2gray 应该会揭示发生了什么(将来输入 2D 图像时):
from numpy import arange, uint8
from skimage.color import rgb2gray
# 2D input
gray = (252 + arange(2 ** 2))[::-1].astype(uint8).reshape((2, 2))
print(gray)
# [[255 254]
# [253 252]]
print(rgb2gray(gray))
# [[255 254]
# [253 252]]
# 1D input
gray = gray.flatten()
print(gray)
# [255 254 253 252]
print(rgb2gray(gray))
# 0.9966290196078431
print((0.2125 * gray[0] + 0.7154 * gray[1] + 0.0721 * gray[2]) / 255)
# 0.9966290196078431
基本上,(扁平化)输入的前三个值将被假定为单个 RGB 元组,因此用于计算该(假定)RGB 元组的亮度。
而第一个 rgb2gray 调用给出了已经声明的警告
FutureWarning:rgb2gray 的行为将在 scikit-image 0.19 中发生变化。目前, rgb2gray 允许将 2D 灰度图像作为输入传递,并且将它们作为输出保持不变。从 0.19 版本开始,二维数组将被视为具有 3 个通道的一维图像。
第二个rgb2gray 调用产生另一个警告:
FutureWarning:非 RGB 图像转换现已弃用。对于 RGBA 图像,请改用 rgb2gray(rgba2rgb(rgb))。在 0.19 版本中,如果输入图像最后一维长度不是 3,则会引发 ValueError。
所以,看看如何准确地处理 2D 图像会很有趣——以防止引发第二个警告中提到的ValueError。
在应用rgb2gray 中提到的更改后,关于向后兼容性的skimage GitHub 问题跟踪器有几个讨论。是的,当您在输入一些灰度图像时依赖 rgb2gray 的“旧”输出时,您会遇到差异。
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1.1
NumPy: 1.20.2
scikit-image: 0.18.1
----------------------------------------