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

来源:互联网 发布:wirelessmon mac版 编辑:程序博客网 时间:2024/05/16 05:20

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

下面将4张图片放在一个窗口中显示。原始图像如下:
这里写图片描述
使用matplotlib将4幅图像显示在一个窗口的代码如下:

# coding=utf-8import cv2import matplotlib.pyplot as pltscooter_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 cv2import matplotlib.pyplot as pltscooter_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模式。

原创粉丝点击