1 opencv-python影象讀寫模組

2023-07-05 18:00:18

這個分類記錄自己學習opencv的隨筆檔案,方便以後查詢和複習。python-opencv環境設定網上教學很多,此處就不做贅述了,該檔案記錄opencv最基礎的影象讀寫和顯示,工具是jupyter notebook。

1 opencv中,影象讀取函數是 imread(filename, flags=None)

引數說明:

filename:讀取影象的路徑,通常支援jpg、png、bmp、tiff等格式檔案。

flags:圖片讀入的模式,模式定義在cv::ImreadModels中,預設值為IMREAD_COLOR。還有一個常用的模式是:IMREAD_GRAYSCALE,對應值為 0,以灰度圖方式讀取圖片。

注意:imread函數返回一個BGR形式的影象物件,其型別為一個numpy陣列。

2 顯示影象的函數是 imshow(window_name, image)   

引數說明:window_name是一個字串,代表要在其中顯示影象的視窗的名稱。image是它是要顯示的影象。

可以用 namedWindow(window_name, flag) 來定義一個視窗,如果沒有定義會根據 imshow 的引數自動生成一個視窗。已經定義的視窗可以用 resizeWindow(window_name,width,height) 來改變視窗大小。

import cv2   
import numpy as np

img=cv2.imread('C:/Users/86188/Desktop/test/python/cat.jpg',cv2.IMREAD_COLOR)  #讀取圖片
cv2.imshow('showimg',img) #顯示圖片 cv2.waitKey(0) #等待使用者操作 cv2.destroyWindow('window') #銷燬視窗

3  除了直接用opencv的imshow來顯示圖片,也可以用matplotlib來顯示圖片

注意需要在顯示的時候進行圖片通道翻轉(直接用::-1,也可以用cvtColor()函數進行顏色通道翻轉),否則顯示的圖片顏色會異常,因為正常圖片的格式是RGB,但是opencv讀取進來的格式是BGR。

         

 用opencv來顯示影象通常需要好幾行程式碼,可以自己封裝成函數,需要的時候直接呼叫:

       

 

4 opencv中影象的屬性

在 OpenCV 中,影象是一個 NumPy 陣列,我們可以使用numpy陣列的屬性來存取影象屬性:

  • 影象型別 - 影象的資料結構。OpenCV中的影象是numpy.ndarray,我們可以將其存取為 type(img) 。
  • 影象形狀 - 它是以 [H, W, C] 格式表示的形狀。其中 H,W 和 C 分別是影象的 高度,寬度和通道數 ,我們可以將其存取為 img.shape 。

  • 影象大小 - 它是影象中畫素的總數。它也是陣列中元素的總數。我們可以將其存取為 img.size 。

  • 資料型別 - 它是影象陣列元素的dtype。我們可以將其存取為 img.dtype 。

5 圖片儲存 imwrite(filename,img) 

引數說明: filename 表示儲存的檔名稱,img 是需要儲存的影象物件。

建立視窗,讀取顯示和儲存影象的範例如下:

import cv2

#建立視窗
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)

#讀取圖片
img = cv2.imread('./cat.jpg')

while True:
    cv2.imshow('img',img)
    key = cv2.waitKey(0)  #該函數的返回值為ASCLL碼,引數0表示:等待 0 毫秒後,使用者可以通過按鍵盤上的任意鍵來銷燬所有視窗。
    
    if key == ord('q'): #如果鍵盤輸入q,退出
        break
    elif key == ord('s'):  #如果鍵盤輸入s,儲存圖片到 當前資料夾下
        cv2.imwrite('./mycat.png',img)
    else:
        print(key)
        
cv2.destroyAllWindows()  #銷燬當前所有視窗

 此外,opencv中也可以進行多幅影象的讀取,函數是 imreadmulti(filename) 引數filename是待讀取的影象檔案路徑,返回的結果是tuple型別,包含兩個值,第一個為bool型別,表示是否讀取成功;第二個引數是list型別,儲存讀取的影象結果。多幅影象儲存可以用imwritemulti(filename,img) .引數filename表示儲存的影象檔名稱,img是影象資料。