为什么matplotlib显示opencv图像不正常

来源:转载



在前面的《数字图像的加载、显示和输出》中提到,opencv对多个图片输出在同一个窗口并没有直接的支持手段,但有时候我们会有这个需求,这时可以用matplotlib搭配使用。


下面将4张图片放在一个窗口中显示。原始图像如下:

使用matplotlib将4幅图像显示在一个窗口的代码如下:


# coding=utf-8
import cv2
import matplotlib.pyplot as plt
scooter_path = "scooter.png"# 带alpha通道的彩色图像
lenna_path = "lenna.bmp"# 3通道彩色图像
baboon_path = "baboon.bmp" # 3通道彩色图像
moon_path = "moon.bmp"# 灰度图像
pic = [scooter_path, lenna_path, baboon_path, moon_path]
plt.figure(figsize=(8, 6))
for i in range(4):
img = cv2.imread(pic[i])
plt.subplot(2, 2, i + 1)
plt.imshow(img)
plt.title(pic[i])
plt.show()

显示如下:



可以看出,图像的颜色显示不正常。


这是因为matplotlib使用的颜色模式是我们现在流行的RGB模式,而opencv使用的是BGR模式,即RGB的倒序模式,与我们通常的RGB是反向的。因此在使用matplotlib显示之前需要做一下图像颜色的转换。
注意下面代码中如下这一行:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


import cv2
import matplotlib.pyplot as plt
scooter_path = "scooter.png"# 带alpha通道的彩色图像
lenna_path = "lenna.bmp"# 3通道彩色图像
baboon_path = "baboon.bmp"# 3通道彩色图像
moon_path = "moon.bmp"# 灰度图像
pic = [scooter_path, lenna_path, baboon_path, moon_path]
plt.figure(figsize=(8, 6))
for i in range(4):
img = cv2.imread(pic[i])
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 注意这行。
plt.subplot(2, 2, i + 1)
plt.imshow(img)
plt.title(pic[i])
plt.show()

再次输出,这次正常了:


那么问题来了,为什么opencv要采用BGR顺序的模式呢?这又是因为历史原因,早期的opencv开发者采用了BGR顺序,所以一直遗留下来了。那么早期的opencv开发者为什么要用BGR呢,因为那时的许多照相机生产厂家和软件开发商就是采用的BGR模式。





分享给朋友:
您可能感兴趣的文章:
随机阅读: