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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM