OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别
1、关于python中size与shape的用法,我一直是一头雾水,今天总结下,size既可以用作属性亦可以当做函数来使用,如a.size,np.szie(a),它是用来判断数组中所有元素的个数
,而shap与size类似,既可以用作属性亦可以当做函数来使用,如b.shape,np.shape(b),他是用来判断数组的维度
2、关于图像的加载与显示,plt.imshow与cv2.imshow显示的时候会有色差的问题,因为OpenCV显示的BGR,而plt.imshow显示的是RGB
3、通道的分离与融合分别是OpenCV中的split与merge函数
4、通过scipy.misc方法将图片转换成数组格式
#!/usr/bin/env python 3.6 #_*_coding:utf-8 _*_ #@Time :2019/12/25 21:42 #@Author :控制工程小小白 #@FileName: RGB_split_merge.py #@Software: PyCharm from PIL import Image import cv2 from scipy import misc from matplotlib import pyplot as plt import numpy as np image_PIL=Image.open("our happy time.jpg")#打开图片 """判断图像类型并使用size,shape 用法""" """---------------------------------------------------------------------""" print(type(image_PIL))#此时的image不是数组格式,而是图片格式 image_numpy=misc.imread("our happy time.jpg")#通过scipy.misc方法将图片转换成数组格式 print(image_numpy) print(type(image_numpy))#此时的输出是数组格式 print(np.size(image_numpy))#size既可以用作对象的属性a.size,也可以用作方法np.size(a),输出数组的元素的所有个数 print(image_numpy.size) print(np.shape(image_numpy))#与size一样,既可以用作对象的属性a.shape,也可以用作方法np.shape(a),输出数组的维度 print(image_numpy.shape) """---------------------------------------------------------------------------------------""" """对于采用Image方法类读取并且显示图片时,下面4行一般配套使用""" plt.figure(‘jiaqi‘)#打开显示的窗口并给显示的窗口命名 plt.imshow(image_PIL)#imshow方法显示要显示的图片,如果没有plt.show()的配套使用,将不会显示图橡 plt.axis(‘on‘)#显示坐标轴 plt.show()#与plt.imshow配套使用 """---------------------------------------------------------------------------""" """opencv 加载与显示与保存图像""" image_opencv=cv2.imread("our happy time.jpg")#是用OpenCV方法打开图像 cv2.namedWindow(‘our happy time.jpg‘,cv2.WINDOW_NORMAL)#创建一个显示窗口并命名 cv2.imshow(‘our happy time.jpg‘,image_opencv)#在这里需要注意OpenCV显示的图像与matplotlib显示的图像会有色差问题 #因为plt.show()接口是RGB,而OpenCV是BGR plt.imshow(image_opencv)#注意这个是用OpenCV读取图像,但是是用matplotlib显示图像,个人觉得这个比cv2.imshow()显示效果要好 plt.show() cv2.namedWindow(‘OpenCV_image‘,cv2.WINDOW_NORMAL)#创建一个显示窗口并命名 cv2.imshow(‘OpenCV_image‘,image_opencv) cv2.waitKey(0) k=cv2.waitKey(0)#等待键入指令 if k==27:#wait for ESC key to exit cv2.destroyAllWindows()#销毁窗口 elif k==ord(‘s‘):#键入s就保存窗口 cv2.imwrite(‘our happy time.jpg‘,image_opencv) cv2.destroyAllWindows() """探索OpenCV与plt.show()显示图像的区别""" b,g,r=cv2.split(image_opencv)#将图像的三个通道分开,分别是B,G,R image_merge=cv2.merge([r,g,b])#将三个通道按照R,G,B顺序进行融合 plt.figure(‘image‘) plt.subplot(231);plt.imshow(image_opencv)#显示使用OpenCV打开的图像BGR plt.subplot(232);plt.imshow(image_PIL)#显示使用PIL打开的图像 plt.subplot(233);plt.imshow(b)#分别显示三个通道的图像 plt.subplot(234);plt.imshow(g) plt.subplot(235);plt.imshow(r) plt.subplot(236);plt.imshow(image_merge)#显示融合之后的RGB图像 plt.show()
输出结果:
<class ‘PIL.PngImagePlugin.PngImageFile‘>
[[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
...
[[ 84 18 60]
[ 84 18 60]
[ 92 27 58]
...
[173 73 84]
[172 68 76]
[177 62 79]]
[[ 82 22 57]
[ 82 22 57]
[ 96 32 62]
...
[179 70 79]
[181 71 81]
[185 74 81]]
[[ 82 22 57]
[ 82 22 57]
[ 96 32 62]
...
[179 70 79]
[181 71 81]
[185 74 81]]]
<class ‘numpy.ndarray‘>
786432
786432
(512, 512, 3)
(512, 512, 3)