天天看點

3、圖檔處理

1、目标

a、在這裡将會學到怎樣讀取一副圖像,怎樣顯示幅圖像,以及如何儲存一副圖像

b、要學習的函數如下:

cv2.imread(),cv2.imshow(),cv2.imwrite()

c、還可以使用Matplotlib顯示一幅圖檔

2、讀入一幅圖像

3、圖檔處理

警告:就算圖像的路徑是錯的,OpenCV 也不會提醒你的,但是當你使用命

令print img時得到的結果是None。

3、圖檔處理
3、圖檔處理
3、圖檔處理
3、圖檔處理
3、儲存一幅圖像
3、圖檔處理

4、總結

下面的程式将會加載一個灰階圖,顯示圖檔,按下’s’鍵儲存後退出,或者

按下 ESC 鍵退出不儲存。

3、圖檔處理

5、使用Matplotlib

Matplotib 是 python 的一個繪圖庫,裡頭有各種各樣的繪圖方法。之後

會陸續了解到。現在,你可以學習怎樣用 Matplotib 顯示圖像。你可以放大圖

像,儲存它等等。

3、圖檔處理

參見:Matplotib 有多種繪圖選擇。具體可以參見 Matplotib docs。我們也

會陸續了解一些

注意:彩色圖像使用 OpenCV 加載時是 BGR 模式。但是 Matplotib 是 RGB

模式。是以彩色圖像如果已經被 OpenCV 讀取,那它将不會被 Matplotib 正

确顯示。具體細節請看練習

附加資源:

Matplotlib Plotting Styles and Features

http://matplotlib.org/api/pyplot_api.html

練習:

1. 當你用 OpenCV 加載一個彩色圖像,并用 Matplotib 顯示它時會遇

到一些困難。請閱讀this discussion并且嘗試了解它。

在opencv中彩色圖的順序是BGR,而在matplotlib中彩色圖的順序是RGB,如何互相轉換,

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('messi4.jpg')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.subplot(121);plt.imshow(img) # expects distorted color
plt.subplot(122);plt.imshow(img2) # expect true color
plt.show()

cv2.imshow('bgr image',img) # expects true color
cv2.imshow('rgb image',img2) # expects distorted color
cv2.waitKey(0)
cv2.destroyAllWindows()      

NB : Please check @Amro 's comment below for better method of conversion between BGR and RGB. ​

​img2 = img[:,:,::-1]​

​ . Very simple.

Run this code and see the difference in result yourself. Below is what I got :

3、圖檔處理
3、圖檔處理

補充:

1、用cv2.imshow顯示圖像,這種方式顯示的視窗無法調整,當顯示的圖像較大時,就無法看到完整的圖像,是以選擇先建立視窗再顯示圖像。

  1. import cv2 
  2. img = cv2.imread('lena.jpg') 
  3. win = cv2.namedWindow('test', flags=0) 
  4. cv2.imshow('test', img) 
  5. cv2.waitKey(0) 

OpenCV采用視窗名稱來通路視窗,而不是視窗句柄之類的東西。

flags為0表示視窗可以用滑鼠來改變大小,此時顯示的圖像也跟着視窗大小變化,需要注意的是它可能會導緻圖像的變形:

2、matplotlib圖像顯示

  1. mport cv2  
  2. import matplotlib.pyplot as plt  
  3. img = cv2.imread('lena.jpg')  
  4. plt.imshow(img)  
  5. plt.show()  

 顔色有問題,下面将第1通道和第3通道交換後顯示:

  1. import numpy as np  
  2. import cv2  
  3. (r, g, b)=cv2.split(img)  
  4. img=cv2.merge([b,g,r])  

就正常了

3、用plt讀取圖像

再比較一下plt.imread和cv2.imread的差别:

  1. img1 = cv2.imread('lena.jpg')  
  2. img2 = plt.imread('lena.jpg')  
  3. plt.subplot(121)  
  4. plt.imshow(img1)  
  5. plt.subplot(122)  
  6. plt.imshow(img2)  

上述代碼讀取同一張圖像并用相同的方法顯示,差異還是在顔色通道上:

3、圖檔處理

4、matplotlib顯示灰階圖

對于隻有一個顔色通道的圖像,matplotlib可以指定一個map,将單個顔色通道的圖像轉換為彩色圖像。

matplotlib支援下面的map。