cv2 灰度有 3 个通道和奇怪的蓝黄色调

问题描述

我对 cv2 有以下问题 当我正常加载图像时,一切都很好:

    img = cv2.imread(file,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    print(img.shape)

enter image description here

当我尝试加载灰度时,出现以下问题

gray = cv2.cvtColor(img,cv2.IMREAD_GRAYSCALE)
plt.imshow(gray)
print(gray.shape)

这给了我 4 个通道,但至少有一个灰色图像

enter image description here

但是这段代码

plt.show()
img = cv2.imread(file,cv2.IMREAD_GRAYSCALE)
print(img.shape)
plt.imshow(img)
plt.show()

给了我 1 个频道,但是一个奇怪的蓝黄色图像

enter image description here

我的问题是, 我可以加载具有 1 个通道的灰度图像吗? 谢谢大家的时间

解决方法

OpenCV 正确读取图像,问题在于 MatPlotLib 的 imshow() 函数,因为它将单通道图像显示为颜色图。

要指定灰度,将 cmap 参数传递给 imshow 函数,如下所示:

img = cv2.imread(file,cv2.IMREAD_GRAYSCALE)
print(img.shape)
plt.imshow(img,cmap="gray")

注意:在您的示例中,您分别使用了 cv2.imread(file,cv2.COLOR_BGR2RGB)cv2.cvtColor(img,cv2.IMREAD_GRAYSCALE)cv2.COLOR_BGR2RGBcv2.IMREAD_GRAYSCALE 都是告诉 imread()cvtColor() 函数如何表现的标志(例如,返回灰度图像)。虽然它们都被函数接受,但它们可能不会做你想让它们做的事情,因此建议只使用为每个函数指定的标志。任何以 IMREAD_ 开头的标志只能与 OpenCV 的 imread() 函数一起使用。同样,任何以 COLOR_ 开头的标志只能与 cvtColor()

一起使用