Matplotlib imshow 扭曲颜色

26

我已经尝试使用Matplotlib.pyplot的imshow函数展示灰度图像,效果非常好。但当我尝试展示RGB图像时,它会改变颜色,呈现出更加蓝色的颜色。

以下是一个示例:

import cv2
import matplotlib.pyplot as plt
lena=cv2.imread("lena.jpg")
plt.imshow(lena)
plt.show()

生成的图像类似于这个

而原始图像是这个

如果与颜色映射相关,是否有办法使其适用于RGB图像?

2个回答

41

这对我有用:

plt.imshow(lena[:,:,::-1]) # RGB-> BGR

同样的思路,但更好更健壮的方法是使用"省略号",由@rayryeng提出:

plt.imshow(lena[...,::-1])

6
你也可以使用 lena[...,::-1]。在省略号出现的位置,自动收集最后一个维度之前的所有维度。 - rayryeng
1
@rayryeng 谢谢!我只是为了好玩才来到 Stack Overflow。所有这些声望都只是为了刺激而已。 - AGN Gazer
1
我曾经经常回答问题,但工作和生活阻碍了我...不过,我仍然期待着获得10万的声望值。我想要那份赞助!(https://meta.stackoverflow.com/questions/291791/what-do-i-get-with-100k-reputation) - rayryeng
1
@rayryeng:“不过,我还是期待着获得10万声望值。” 恭喜!我刚看到你已经获得了! - AGN Gazer
哈哈,哇,这个回答已经写了将近4年了。感谢您的记忆,希望一切都好! - rayryeng
显示剩余5条评论

25

OpenCV使用BGR表示图像,而不是我们期望的RGB。由于顺序相反,因此在图像中看到蓝色较多。尝试使用以下代码中的行(在注释下面)将BGR转换为RGB:

import cv2
import matplotlib.pyplot as plt
lena=cv2.imread("lena.jpg")
#plt.imshow(lena)
#plt.axis("off")
#Converts from BGR to RGB
plt.imshow(cv2.cvtColor(lena, cv2.COLOR_BGR2RGB))
plt.show()

1
您也可以使用NumPy语法自行反转通道:image[...,::-1] - rayryeng
那绝对是另一个选项。由于正在使用OpenCV,我认为引入一个相关的颜色转换函数会很有用。 - pragmaticprog
当然,实际上如果你想留在OpenCV领域,那么这会更冗长,但是自己反转通道提供的开销较小。这取决于使用情况。如果您打算重复执行此操作,则切片可能更好,但如果您只是执行一次此操作,则调用cvtColor更明确。无论哪种方式,都很好地解决了问题! - rayryeng
那是真的。另外,谢谢! - pragmaticprog

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