OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别
Posted 控制工程小小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方法将图片转换成数组格式
1 #!/usr/bin/env python 3.6 2 #_*_coding:utf-8 _*_ 3 #@Time :2019/12/25 21:42 4 #@Author :控制工程小小白 5 #@FileName: RGB_split_merge.py 6 7 #@Software: PyCharm 8 from PIL import Image 9 import cv2 10 from scipy import misc 11 from matplotlib import pyplot as plt 12 import numpy as np 13 image_PIL=Image.open("our happy time.jpg")#打开图片 14 """判断图像类型并使用size,shape 用法""" 15 """---------------------------------------------------------------------""" 16 print(type(image_PIL))#此时的image不是数组格式,而是图片格式 17 image_numpy=misc.imread("our happy time.jpg")#通过scipy.misc方法将图片转换成数组格式 18 print(image_numpy) 19 print(type(image_numpy))#此时的输出是数组格式 20 print(np.size(image_numpy))#size既可以用作对象的属性a.size,也可以用作方法np.size(a),输出数组的元素的所有个数 21 print(image_numpy.size) 22 print(np.shape(image_numpy))#与size一样,既可以用作对象的属性a.shape,也可以用作方法np.shape(a),输出数组的维度 23 print(image_numpy.shape) 24 """---------------------------------------------------------------------------------------""" 25 """对于采用Image方法类读取并且显示图片时,下面4行一般配套使用""" 26 plt.figure(\'jiaqi\')#打开显示的窗口并给显示的窗口命名 27 plt.imshow(image_PIL)#imshow方法显示要显示的图片,如果没有plt.show()的配套使用,将不会显示图橡 28 plt.axis(\'on\')#显示坐标轴 29 plt.show()#与plt.imshow配套使用 30 """---------------------------------------------------------------------------""" 31 """opencv 加载与显示与保存图像""" 32 image_opencv=cv2.imread("our happy time.jpg")#是用OpenCV方法打开图像 33 cv2.namedWindow(\'our happy time.jpg\',cv2.WINDOW_NORMAL)#创建一个显示窗口并命名 34 cv2.imshow(\'our happy time.jpg\',image_opencv)#在这里需要注意OpenCV显示的图像与matplotlib显示的图像会有色差问题 35 #因为plt.show()接口是RGB,而OpenCV是BGR 36 plt.imshow(image_opencv)#注意这个是用OpenCV读取图像,但是是用matplotlib显示图像,个人觉得这个比cv2.imshow()显示效果要好 37 plt.show() 38 cv2.namedWindow(\'OpenCV_image\',cv2.WINDOW_NORMAL)#创建一个显示窗口并命名 39 cv2.imshow(\'OpenCV_image\',image_opencv) 40 cv2.waitKey(0) 41 k=cv2.waitKey(0)#等待键入指令 42 if k==27:#wait for ESC key to exit 43 cv2.destroyAllWindows()#销毁窗口 44 elif k==ord(\'s\'):#键入s就保存窗口 45 cv2.imwrite(\'our happy time.jpg\',image_opencv) 46 cv2.destroyAllWindows() 47 """探索OpenCV与plt.show()显示图像的区别""" 48 b,g,r=cv2.split(image_opencv)#将图像的三个通道分开,分别是B,G,R 49 image_merge=cv2.merge([r,g,b])#将三个通道按照R,G,B顺序进行融合 50 plt.figure(\'image\') 51 plt.subplot(231);plt.imshow(image_opencv)#显示使用OpenCV打开的图像BGR 52 plt.subplot(232);plt.imshow(image_PIL)#显示使用PIL打开的图像 53 plt.subplot(233);plt.imshow(b)#分别显示三个通道的图像 54 plt.subplot(234);plt.imshow(g) 55 plt.subplot(235);plt.imshow(r) 56 plt.subplot(236);plt.imshow(image_merge)#显示融合之后的RGB图像 57 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)
以上是关于OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 函数学习11-图像通道的拆分(cv2.split)
Python使用OpenCV加载彩色图像为BGR图计算每个图像通道的均值(mean of each channel)可视化图像在每个通道的均值
计算机视觉OpenCV 4高级编程与项目实战(Python版):通道详解
计算机视觉OpenCV 4高级编程与项目实战(Python版):通道详解