您的位置:首页 > 运维架构

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

2017-10-08 09:41 507 查看
在前面的《数字图像的加载、显示和输出》中提到,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模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: