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)

猜你喜欢

转载自www.cnblogs.com/hujinzhou/p/jiazhou2019_12_26.html