OpenCV-Python[第二章]——影象初步
目標
- 學習讀取影象、顯示影象以及儲存影象
- 學習3個OpenCV函式:cv2.imread(),cv2.imshow(),cv2.imwrite()
- 學習使用Matplotlib顯示影象
使用OpenCV顯示影象
讀取影象
使用cv2.imread()讀取影象,影象必須在當前工作目錄否則需要提供完整路徑。
import numpy as np
import cv2
img = cv2.imread('messi5.jpg',0)
第二個引數指定影象的讀取方式:
cv2.IMREAD_COLOR:讀取彩色影象,影象的透明度(alpha通道)被忽略,預設引數。
cv2.IMREAD_GRAYSCALE:灰度影象
cv2.IMREAD_UNCHANGED:讀取原始影象,包括alpha通道
注意:可以使用1,0,-1對應的代替上述3種讀取方式
顯示影象
使用cv2.imshow顯示影象,顯示視窗會自動適應影象大小。
cv2.imshow('image',img)
cv2.waitkey(0)
cv2.destroyAllWindows()
第一個引數是字串,表示視窗的名字,第二個引數是讀取的影象。
cv2.waitKey()是鍵盤繫結函式。引數是毫秒時間數,函式對任意的鍵盤事件等待若干毫秒。如果在指定時間內按下鍵盤,程式繼續。如果引數是0,則無限等待直到鍵盤按鍵發生。
cv2.destroyAllWindows()銷燬建立的所有視窗。如果想銷燬指定視窗使用cv2.destroyWindows(),並給其傳遞特定視窗名字做引數。
注意:有時候你可以先建立一個視窗,然後再載入影象,此時使用cv2.namedWindow()你可以指定視窗是否大小可變.其預設引數是cv2.WINDOW_AUTOSIZE,當傳遞的引數是cv2.WINDOWN_NORMAL時,視窗大小可變。
儲存影象
使用函式cv2.imwrite()。
cv2.imwrite('messigray.png',img)
第一個引數是檔名,第二個引數是需要儲存的影象。
下面是一段比較完整的程式碼:
import numpy as np
import cv2
img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s' ): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
使用Matplotlib顯示影象
Matplotlib是一個python庫,提供了一系列的畫圖方法。下面是Matplotlib畫圖的一個示例:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
使用Matplotlib畫圖可以進行縮放、儲存等操作。
警告:OpenCV讀取的彩色影象是BGR格式,Matplotlib顯示彩色影象是按照RGB,因此如果使用OpenCV讀取影象,則可能無法使用Matplotlib進行正常彩色的顯示,需要對讀取的影象資料進行轉換
方法1:split&merge
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('messi5.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()
方法2:img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)