1. 程式人生 > >OpenCV-Python[第二章]——影象初步

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)