首頁 > 軟體

Python詳細講解影象處理的而兩種庫OpenCV和Pillow

2022-06-14 14:02:16

一、簡介

實現計算機視覺任務的過程中,不可避免地需要對影象進行讀寫操作以及影象預處理操作,下面介紹兩個常用的Python影象處理庫:OpenCV和Pillow。

OpenCV全稱是由英特爾公司資助的開源計算機視覺庫。

  • 它由一系列C函數和少量C++類所組成,實現影象處理和計算機視覺方面的很多通用演演算法,例如特徵檢測與跟蹤、運動分析、目標分割與識別以及3D重建等。
  • OpenCV作為基於C/C++語言編寫的跨平臺開源軟體,可以執行在Linux、Windows、Android和MacOS作業系統上,同時提供了Python、Ruby、MATLAB等語言的介面,實現了影象處理和計算機視覺方面的很多通用演演算法。

1.1 影象處理-OpenCV

OpenCV是模組結構的,有以下主要模組。

  • 【core】–核心功能模組,包含內容有:OpenCV基本資料結構、動態資料結構、繪圖函數、陣列操作相關函數、輔助功能與系統函數和宏、與OpenGL的互操作。
  • 【imgproc】–影象處理模組,包含內容有:線性和非線性的影象濾波、影象的幾何變換、影象轉換、直方圖相關、結構分析和形狀描述、運動分析和物件跟蹤、特徵檢測、目標檢測等內容。
  • 【features2D】–2D功能模組,包含以下內容:特徵檢測和描述、特徵檢測器、描述符提取器等內容。
  • 【highGUI】–高層GUI圖形化使用者介面,包含:媒體的I/O輸入輸出、視訊捕捉、影象和視訊的編碼解碼、圖形互動介面的介面等內容。

1.2 影象處理- PIL和Pillow

作為Python2的第三方影象處理庫是Pillow的前身。隨著Python3的更新,PIL移植到Python3更名為Pillow。與OpenCV一樣,Pillow也是模組結構,主要包括以下結構。

  • 【Image】–影象功能模組,包含內容有:讀寫影象、影象混合、影象放縮、影象裁切、影象旋轉。
  • 【ImageFilter】–影象濾波功能模組,包含內容有:各類影象濾波核。
  • 【ImageEnhance】–影象增強功能模組,包含內容有:色彩增強、亮度增強、對比度增強、清晰度增強。
  • 【ImageDraw】–影象繪畫功能模組,包含內容有:繪製幾何形狀、繪製文字。

二、常用影象型別

2.1 二值影象

二值影象只有黑白兩種顏色,如圖所示。影象中的每個畫素只能是黑或白,沒有中間的過渡。因此二值影象的畫素值只能為0或1,0表示黑色,1表示白色。

2.2 灰度影象

  • 灰度影象只表達影象的亮度資訊沒有顏色資訊,如(a)圖所示。
  • 灰度影象的每個畫素點上只包含一個量化的灰度級(即灰度值)。
  • 畫素點的亮度水平如(b)圖所示,通常使用1位元組(8位元二進位制數)來儲存灰度值,因此用正整數表示灰度值的範圍是0~255。

2.3 RGB影象

  • RGB(Red、Green、Blue)影象如(a)圖,可以看成是由多個RGB畫素點組成。
  • 每個彩色畫素點分別由R、G、B三種顏色空間組成如(b)圖,本質是3維陣列。
  • 在RGB顏色空間中,任意色光都可以用R、G、B三色不同分量的相加混合而成。

2.4 常用顏色空間簡介

實際應用中常用的顏色空間很多,通常使用3個獨立的變數對顏色進行描述,例如RGB、HSV、YUV等。

一個影象的不同的顏色空間是可以轉換的,cv2.cvtColor可以實現顏色的轉換。

• cv2.COLOR_BGR2GRAY

• cv2.COLOR_BGR2RGB

• cv2.COLOR_BGR2HSV

• cv2.COLOR_BGR2YUV

• cv2.COLOR_BGR2HLS

三、OpenCV影象讀寫與顯示

通過OpenCV庫對數位影像進行處理時,涉及到的基礎操作包括讀取、顯示、寫出影象檔案。

在OpenCV庫中,影象資料是以NumPy陣列的形式存在。

3.1 讀入影象

在python的OpenCV中,通過cv2.imread()函數讀入影象資料,其基本使用格式如下。cv2.imread(filename, flags)

在預設情況下通過cv2.imread()

函數讀入影象資料為3通道的彩色圖,畫素值為8位元的非負整數,影象資料以NumPy中ndarray的方式存在。

如果定義了cv2.imread()讀入模式為cv2.IMREAD_GRAYSCALE那麼讀入影象為單通道的灰度圖。

需要注意的是,通過OpenCV讀入彩色影象資料的顏色通道順序為BGR(藍、綠、紅)並非常用的RGB(紅、綠、藍)順序。

在OpenCV中,讀取到的影象陣列維度可以表示為:

(高,寬,通道數)即(height, width, channel)。OpenCV影象座標與常規的數學座標有區別,左上角位置為座標原點。

• 在Windows【畫圖】工具中,帽檐紅點座標為(248, 102),但在OpenCV中畫素位置應為(102, 248)。

• X軸 == 列位置 == 影象寬

• Y軸 == 行位置 == 影象高

3.2 顯示影象

  • 在OpenCV中,通過cv2.imshow()函數顯示影象資料,其基本使用格式如下。
  • cv2.imshow(winname, img)
  • 在OpenCV中,通過cv2.waitKey()函數設定圖片視窗顯示時長,其基本使用格式如下。
  • cv2.waitKey([,delay])
  • waitKey作用是影象顯示時等待使用者按鍵觸發,如果使用者按鍵觸發或時間超過了設定的時間則退出圖片展示。
  • cv2.waitKey(0)的作用是令程式一直停留在顯示影象的狀態。如果沒有增加cv2.waitKey(0),那麼程式執行完畢後,影象顯示視窗會自動關閉,即一閃而逝。

3.3 寫出影象

  • 在OpenCV中,通過cv2.write()函數儲存影象資料,其基本使用格式如下。
  • cv2.imwrite(filename, img)
import cv2
import matplotlib.pyplot as plt
import numpy
# 讀寫影象
img = cv2.imread(filename='lena.jpg', flags=cv2.IMREAD_GRAYSCALE)
img.shape
# (377, 373)
img.dtype
# dtype('uint8')
# 影象展示
cv2.imshow(winname='lena', mat=img)
cv2.waitKey(0)
# 影象儲存
cv2.imwrite(filename='test_img.jpg', img=img)

四、影象幾何變換

4.1 影象平移

影象平移變換將一幅影象中的所有畫素點都按照給定的偏移量在水平方向(沿x軸方向)或垂直方向(沿y軸方向)移動,是影象幾何變換中較為簡單的一種變換。

影象平移原理示意圖如下圖所示。

假設對點P_0 (x_0,y_0 )進行平移後得到點P(x,y),其中x方向的平移量為∆x,y方向的平移量為∆y ,則點P(x,y)的座標如下式。

利用齊次座標表示影象平移變換前後點P_0 (x_0,y_0 )到點P(x,y)的關係如下式所示。

實現步驟:

1. 定義平移變換矩陣: 例如:np.float32([[1,0,50], [0,1,100]])

• [1,0,50]表示在x軸方向移動50個單位

• [0,1,100]表示在y軸方向移動100個單位

2. 執行轉換:cv2.warpAffine (src, M, dsize)

通過OpenCV實現影象平移操作,結果如下圖所示,(a)為原圖和(b)為平移後影象。

import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('lena.jpg')
height, width, channel = img.shape
# 影象平移
# 1、定義平移變換矩陣
M = np.float32([[1,0,50], [0,1,100]])
# 2、執行平移變換
img_tran = cv2.warpAffine(src=img, M=M, dsize=(height, width))
cv2.imshow('image translation', img_tran)
cv2.waitKey(0)

4.2 影象旋轉

影象旋轉(Rotation)是指影象以某一點為中心旋轉一定的角度形成一幅新的影象的過程。通常是以影象的中心為圓心旋轉,將影象中的所有畫素點都旋轉一個相同的角度。

影象旋轉原理如圖所示,將點(x_0,y_0)繞原點o順時針旋轉至點(x_1,y_1 ),其中a為旋轉角,r為點(x_0,y_0 )到原點的距離, b為原點o到點(x_0,y_0 )的線段與x軸之間的夾角。在旋轉過程中, r保持不變。

設旋轉前,x_0、y_0的座標分別為x_0=r cos⁡b、y_0=r sin⁡b,當旋轉a角度後,座標x_1、y_1的值分別如下式所示。

上式的矩陣的形式如下式所示。

實現步驟:

1. 計算旋轉變換矩陣: cv2.getRotationMatrix2D (center, angle, scale)

2. 執行轉換:cv2.warpAffine (src, M, dsize)

通過OpenCV實現影象旋轉,得到的效果如圖所示。

# 影象旋轉
# 1、定義旋轉變換矩陣
M = cv2.getRotationMatrix2D(center=(height*0.5, width*0.5), # 旋轉的中心位置座標
                            angle=45,   # 旋轉的角度
                            scale=0.8   # 縮放比例
                            )
# 2、執行旋轉變換
img_rotation = cv2.warpAffine(img, M, dsize=(height,width))
cv2.imshow('image_rotation', img_rotation)
cv2.waitKey(0)

4.3 影象縮放

影象比例縮放是指將給定的影象在x軸方向按比例縮放f_x倍,在y軸方向按比例縮放f_y倍,從而獲得一幅新的影象。如果f_x=f_y,即x軸方向和y軸方向縮放的比率相同,此比例縮放為影象的全比例縮放。如果f_x≠f_y,那麼影象的比例縮放會改變原始影象的畫素間的相對位置,產生幾何畸變。

在OpenCV中cv2.resize(src, dsize, fx, fy, interpolation)可以實現影象縮放。

具體實現影象縮放有多種插值方法,OpenCV的resize函數提供瞭如下5種常見方法。

• 最鄰近插值:cv2.INTER_NEAREST

• 雙線性插值:cv2.INTER_LINEAR

• 區域插值:cv2.INTER_AREA

• 三次樣條插值:cv2.INTER_CUBIC

• Lanczos插值:cv2.INTER_LANCZOS4

# 影象縮放
# 1、直接指定縮放大小
img_res = cv2.resize(img, dsize=(244,244))
img_res.shape
# (244, 244, 3)
cv2.imshow('image_resize', img_res)
cv2.waitKey(0)
# 2、最近鄰插值
img_near = cv2.resize(img, dsize=None, fx=1.5, fy=1,
                     interpolation=cv2.INTER_NEAREST)
cv2.imshow('img_near', img_near)
cv2.waitKey(0)

到此這篇關於Python詳細講解影象處理的而兩種庫OpenCV和Pillow的文章就介紹到這了,更多相關Python影象處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com