cv2和plt读取显示图像问题——Python+Opencv学习系列

一、问题阐述

        我们一般利用cv2.imread来读取彩色图像和灰度图像,并可利用cv2.imshow来显示图像;但在特殊场合下,我们为了方便对比区分,需采用matplotlib.pyplot来显示图像,就如下图所示。

cv2和plt读取显示图像问题——Python+Opencv学习系列_第1张图片

         本次遇到的问题是两种方法显示彩色和灰度图像的结果有差异,当利用cv2.imshow显示读取彩色图像时,会“偏黄”;当利用cv2.imshow显示读取的灰度图像时符合我们正常的灰度图像,但利用plt.show显示读取的灰度图像时更像是彩色的,代码和图像如下所示。

代码:

import cv2  #opencv的读取格式是BGR
# print(cv2.__version__)
import matplotlib.pyplot as plt

##读取图像数据
def cv_show(name,img):   #创建窗口展示图像
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('picture.png',cv2.IMREAD_COLOR)  #读取彩色图
print(img)
cv_show('image',img) #显示彩色图

img1 = cv2.imread('picture.png',cv2.IMREAD_GRAYSCALE)  #读取并转换成灰度图
cv_show('image',img1) #显示灰度图

plt.subplot(121),plt.imshow(img),plt.title('IMG')  #显示彩色图
plt.subplot(122),plt.imshow(img1),plt.title('IMG1') #显示灰度图
plt.show()

 cv2显示彩色和灰度图:

cv2和plt读取显示图像问题——Python+Opencv学习系列_第2张图片

 plt显示彩色和灰度图:

cv2和plt读取显示图像问题——Python+Opencv学习系列_第3张图片

 二、原理解释和解决办法

        对于彩色图片,一般由R,G,B三个通道构成。然而,需要注意的是,OpenCV里彩色图片加载时是按照BGR的顺序,Matplotlib里彩色图片加载时是按照RGB的顺序。所以,当我们用cv2.imread读入图片,用cv2.imshow来显示时自然是不会出问题的,但若用plt.imshow来显示就会出现问题。所以我们需要对通道进行转换后再显示。

        对于灰度图,通过查阅matplotlib的官方文档发现,plt.imshow()不能直接显示单通道的灰度图,而cv2.imread()所读取的灰度图是单通道的灰度图,正确显示灰度图的方法是显示三通道的灰度图,所以,如果我们想要正确显示上面的灰度图,要先把cv2.imread()读到的单通道的灰度图转换成三通道的灰度图,然后再用plt.imshow()显示出来,但这种方法过于繁琐。我们只需设置cmap的值为‘gray’便可实现正常灰度图的显示,但前提是必须读取为灰度图。

import cv2  #opencv的读取格式是BGR
# print(cv2.__version__)
import matplotlib.pyplot as plt

##读取图像数据
def cv_show(name,img):   #创建窗口展示图像
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('picture.png',cv2.IMREAD_COLOR)  #读取彩色图
img1 = cv2.imread('picture.png',cv2.IMREAD_GRAYSCALE)  #读取并转换成灰度图

b,g,r = cv2.split(img)
img2 = cv2.merge((r,g,b))
plt.subplot(121),plt.imshow(img2),plt.title('IMG')  #显示彩色图
plt.subplot(122),plt.imshow(img1,cmap='gray'),plt.title('IMG1') #显示灰度图时,要设置‘gray’  读取的图片也应是灰度图
plt.show()

cv2和plt读取显示图像问题——Python+Opencv学习系列_第4张图片

 三、总结

        1.显示彩色图时,要把b、r通道调换一下。
        2.显示灰度图时,记得设置cmap的值为'gray'。

 四、第一张图片说明

        第一张图片是在学习图像处理中的边界填充时所制作的,边界填充有四种方法,分别为复制边缘像素填充法、反射法填充、反射法:以最边缘像素为轴填充、外包装法、常量法填充。代码如下:

import cv2  #opencv的读取格式是BGR
# print(cv2.__version__)
import matplotlib.pyplot as plt

img = cv2.imread('picture.png',cv2.IMREAD_COLOR)  #读取彩色图
img1 = cv2.imread('picture.png',cv2.IMREAD_GRAYSCALE)  #读取并转换成灰度图

##边界填充
top_size,bottom_size,left_size,right_size = (50,50,50,50)

img2 = cv2.merge((r,g,b))

replicate = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REPLICATE)  #复制边缘像素填充法
reflect = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT)#反射法填充
reflect101 = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT_101)#反射法:以最边缘像素为轴填充
wrap = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_WRAP)#外包装法
constant = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_CONSTANT,value = 5)#常量法填充

plt.subplot(231),plt.imshow(img2),plt.title('ORIGINAL')   #plt.imshow显示彩色图时,要掉换成RGB顺序
plt.subplot(232),plt.imshow(replicate,cmap='gray'),plt.title('REPLICATE')  #显示灰度图时,要设置‘gray’  读取的图片也应是灰度图
plt.subplot(233),plt.imshow(reflect,cmap='gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,cmap='gray'),plt.title('REFLECT101')
plt.subplot(235),plt.imshow(wrap,cmap='gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,cmap='gray'),plt.title('CONSTANT')
plt.show()

你可能感兴趣的:(opencv,python,人工智能)