cv2的灰度图像有3个通道和一种奇怪的蓝黄色调。

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()

给我一个频道,但图像呈现出奇怪的蓝黄色调。

enter image description here

我的问题是,我能够加载一个只有1个通道的灰度图像吗?谢谢大家的时间。

1个回答

5
OpenCV能够正确读取图像,问题出在MatPlotLib的imshow()函数上,因为它将单通道图像显示为彩色地图。
要指定灰度,请向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()一起使用。

1
你能具体说明一下这个注释吗?我不确定我是否理解了。否则谢谢!假设这是一个imshow问题而不是cv2问题,这样做正确吗?也就是说,矩阵中的值是灰度吗?(它们是为CNN而设定的) - undefined
1
@john 别担心!我在备注中详细解释了,并提到这不是OpenCV的问题,而只是matplotlib使用的表示方法。image对象中的值是相同的,所以只要你在处理中使用它,就不会有问题。如果我的回答符合你的需求,你可以选择它作为被接受的答案 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接