为什么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模式。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值