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)

OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别