【Bug】当用opencv库的imread()函数读取图像,用matplotlib库的plt.imshow()函数显示图像时,图像色彩出现偏差问题的解决方法

一,问题描述

我们在利用opencv的imread读取本地图像,进行一系列处理,但是发现用matplotlib库的imshow()函数显示的时候出现色彩改变 ,比如图像偏黄偏红偏蓝等等,但是对图像的处理并没有对色彩进行过改变。比如下面图像读取显示后直接变为黄色调:

代码如下:

python 复制代码
# encoding:utf-8
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

img_1 = cv2.imread('sp_noise.jpg')
img_2 = cv2.imread('medianBlur.jpg')
img_3 = cv2.imread('mean.jpg')
img_4 = cv2.imread('Gaussian.jpg')

# 显示图形
titles = ['噪声图像', '中值滤波', '均值滤波 ', '高斯滤波']
images = [img_1, img_2, img_3, img_4]
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

二,原因分析

这种色彩偏黄的问题通常是由于图像的颜色通道解释不正确引起的 。在OpenCV中,cv2.imread默认读取图像为BGR 颜色通道顺序,而Matplotlib中plt.imshow默认将颜色通道解释为RGB 。因此,当你用cv2.imread读取图像并用plt.imshow显示时,颜色通道顺序不匹配,导致颜色显示不正确。

三,解决方法

为了解决这个问题,你可以在使用cv2.imread读取图像时,将其转换为RGB颜色通道顺序,或者在使用plt.imshow显示图像时,指定颜色通道的顺序。以下是两种解决方法:

1.在cv2.imread()读取图像后将图像转化为RGB通道

python 复制代码
# 将BGR图像转换为RGB
img_1 = cv2.cvtColor(img_1, cv2.COLOR_BGR2RGB)
img_2 = cv2.cvtColor(img_2, cv2.COLOR_BGR2RGB)
img_3 = cv2.cvtColor(img_3, cv2.COLOR_BGR2RGB)
img_4 = cv2.cvtColor(img_4, cv2.COLOR_BGR2RGB)

2.在plt.imshow()图像后将其转换成BGR通道

python 复制代码
plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))

四,完整代码

方法1:将图像转换为RGB颜色通道顺序

python 复制代码
import cv2
import matplotlib.pyplot as plt

img_1 = cv2.imread('sp_noise.jpg')
img_2 = cv2.imread('medianBlur.jpg')
img_3 = cv2.imread('mean.jpg')
img_4 = cv2.imread('Gaussian.jpg')

# 将BGR图像转换为RGB
img_1 = cv2.cvtColor(img_1, cv2.COLOR_BGR2RGB)
img_2 = cv2.cvtColor(img_2, cv2.COLOR_BGR2RGB)
img_3 = cv2.cvtColor(img_3, cv2.COLOR_BGR2RGB)
img_4 = cv2.cvtColor(img_4, cv2.COLOR_BGR2RGB)

# 显示图形
titles = ['噪声图像', '中值滤波', '均值滤波', '高斯滤波']
images = [img_1, img_2, img_3, img_4]
for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i])
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

方法2:指定plt.imshow中的颜色通道顺序

python 复制代码
import cv2
import matplotlib.pyplot as plt

img_1 = cv2.imread('sp_noise.jpg')
img_2 = cv2.imread('medianBlur.jpg')
img_3 = cv2.imread('mean.jpg')
img_4 = cv2.imread('Gaussian.jpg')

# 显示图形,指定颜色通道顺序为BGR
titles = ['噪声图像', '中值滤波', '均值滤波', '高斯滤波']
images = [img_1, img_2, img_3, img_4]
for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

今日一笑:

范小勤:"我要开挖掘机"

相关推荐
兵慌码乱3 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
梦想三三7 天前
OpenCV银行卡数字识别项目(图像预处理与字符分割)
人工智能·opencv·计算机视觉
武子康7 天前
调查研究-180 roboflow/supervision:计算机视觉工程里的“胶水层“,为什么值得关注?
人工智能·opencv·计算机视觉·chatgpt·llm·向量化
m沐沐8 天前
【计算机视觉】OpenCV 模板匹配银行卡数字识别---下
人工智能·python·opencv·计算机视觉·pycharm·numpy
fie88898 天前
SSR / MSR 图像增强
人工智能·opencv·计算机视觉
sali-tec8 天前
C# 基于OpenCv的视觉工作流-章85-包胶不良检测
图像处理·人工智能·opencv·算法·计算机视觉
FL16238631298 天前
[cmake]基于C++使用纯opencv部署ppocrv5v6的onnx模型
开发语言·c++·opencv
搏博8 天前
多传感器融合基础之一图像空间(Image Space)全面解析
图像处理·python·图像空间·融合感知
2401_885665198 天前
基于OpenCV的模板匹配OCR实战:银行卡与身份证数字识别完整教程
人工智能·python·opencv·计算机视觉·ocr
Robot_Nav8 天前
在非均匀相机抖动去模糊中用IMU辅助的精确模糊核重新估计【文献分析】
图像处理·去运动模糊·imu辅助非盲去卷积