当前位置:   article > 正文

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

plt.imshow打开bgr

一,问题描述

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

 代码如下:

  1. # encoding:utf-8
  2. import cv2
  3. import matplotlib.pyplot as plt
  4. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  5. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  6. img_1 = cv2.imread('sp_noise.jpg')
  7. img_2 = cv2.imread('medianBlur.jpg')
  8. img_3 = cv2.imread('mean.jpg')
  9. img_4 = cv2.imread('Gaussian.jpg')
  10. # 显示图形
  11. titles = ['噪声图像', '中值滤波', '均值滤波 ', '高斯滤波']
  12. images = [img_1, img_2, img_3, img_4]
  13. for i in range(4):
  14. plt.subplot(2, 2, i + 1)
  15. plt.imshow(images[i])
  16. plt.title(titles[i])
  17. plt.xticks([]), plt.yticks([])
  18. plt.show()

二,原因分析

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

三,解决方法

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

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

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

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

plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))

 四,完整代码

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

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. img_1 = cv2.imread('sp_noise.jpg')
  4. img_2 = cv2.imread('medianBlur.jpg')
  5. img_3 = cv2.imread('mean.jpg')
  6. img_4 = cv2.imread('Gaussian.jpg')
  7. # 将BGR图像转换为RGB
  8. img_1 = cv2.cvtColor(img_1, cv2.COLOR_BGR2RGB)
  9. img_2 = cv2.cvtColor(img_2, cv2.COLOR_BGR2RGB)
  10. img_3 = cv2.cvtColor(img_3, cv2.COLOR_BGR2RGB)
  11. img_4 = cv2.cvtColor(img_4, cv2.COLOR_BGR2RGB)
  12. # 显示图形
  13. titles = ['噪声图像', '中值滤波', '均值滤波', '高斯滤波']
  14. images = [img_1, img_2, img_3, img_4]
  15. for i in range(4):
  16. plt.subplot(2, 2, i + 1), plt.imshow(images[i])
  17. plt.title(titles[i])
  18. plt.xticks([]), plt.yticks([])
  19. plt.show()

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

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. img_1 = cv2.imread('sp_noise.jpg')
  4. img_2 = cv2.imread('medianBlur.jpg')
  5. img_3 = cv2.imread('mean.jpg')
  6. img_4 = cv2.imread('Gaussian.jpg')
  7. # 显示图形,指定颜色通道顺序为BGR
  8. titles = ['噪声图像', '中值滤波', '均值滤波', '高斯滤波']
  9. images = [img_1, img_2, img_3, img_4]
  10. for i in range(4):
  11. plt.subplot(2, 2, i + 1), plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
  12. plt.title(titles[i])
  13. plt.xticks([]), plt.yticks([])
  14. plt.show()

 今日一笑:

范小勤:“我要开挖掘机”

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/547259
推荐阅读
相关标签
  

闽ICP备14008679号