将图像转换为灰度

asd*_*das 3 python python-imaging-library python-3.x scikit-image cv2

我想将任何图像转换为灰度,但我不明白这些实现之间的区别。

image = cv2.imread('lenna.jpg')
gray = cv2.cvtColor(image, cv2.IMREAD_GRAYSCALE)

gray1 = rgb2gray(image)

gray2 = cv2.imread('lenna.jpg', cv2.IMREAD_GRAYSCALE)

image1 = Image.open('lenna.jpg', 'r')
gray3 = image1.convert('L')
Run Code Online (Sandbox Code Playgroud)

当我绘制它们时,我分别以蓝色刻度、绿色刻度、绿色刻度和灰色绘制它们。我应该什么时候使用每一种?

Dav*_*ith 6

您遇到过 Python 的类型系统无法像 C++ 那样保护您的情况。

cv2.IMREAD_GRAYSCALEcv2.COLOR_BGR2GRAY是来自不同枚举的值。前者的数值为 0,适用于cv2.imread()。后者的数值为 6,适用于cv2.cvtColor()。C++ 会告诉你cv2.IMREAD_GRAYSCALE不能传递给cv2.cvtColor(). Python 悄悄地接受了相应的 int 值。

因此,您认为您要求 cv2 将彩色图像转换为灰色,但通过传递cv2.IMREAD_GRAYSCALEcv2.cvtColor()看到值 0,并认为您传递了cv2.COLOR_BGR2BGRA。您得到的不是灰度图像,而是添加了 alpha 通道的原始图像。

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Run Code Online (Sandbox Code Playgroud)

是你需要的。

假设您使用的是 Jupyter 笔记本,您看到的另一个问题是cv2按 BGR 顺序而不是 RGB 对颜色平面进行分层。要正确显示它们,请首先执行

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Run Code Online (Sandbox Code Playgroud)

然后显示结果。