封面圖片由Pexels在Pixabay上發布,本人添加了 OpenCV 的 Logo 融合而成
在完成畢業設計後我再也沒有碰過圖像處理相關的東西,進入公司後也是作為前端開發學習和工作(於是乎才有了 Vue 的學習筆記),但是當我再開始做圖像處理相關的事情時,我發現自己全然忘卻了怎麼調用函數,於是乎決定整理一份。
本人習慣import cv2 as cv
,所以下面的調用均以 cv 為準,格式中 dst 為目標圖像的 mat 對象,src 為原始圖像的 mat 對象(就是用 imread 讀進去的那個)
獲取圖片的尺寸#
print 一下 src.shape,可以發現結果為(高度,寬度,通道數)
,那麼獲取圖片的高度和寬度可以使用以下語句實現:
src_height, src_width = src.shape[0:2]
圖像縮放函數 resize ()#
常用函數格式:
dst = cv.resize(src, dsize)
其中 dsize 為類似於(int(source_width / 2), int(source_height / 2))
形式的元組,代表了圖片的放縮倍率,例子中是保持長寬比放縮了一半,參數可調。
圖像顏色轉換函數 cvtColor ()#
常用函數格式:
dst = cv.cvtColor(src, colorCode)
其中 colorCode 部分在庫中有對應代碼,例如cv.COLOR_RGB2GRAY
這樣子的。
該函數常用於灰度化等。
圖像降噪常用方法高斯模糊 GaussianBlur ()#
常用函數格式:
dst = cv.GaussianBlur(src, ksize, sigmaX)
ksize 為卷積核的大小,只能為正奇數元組,例如 (3, 3)、(5, 5) 這樣子,通俗來講就是鄰域大小,對某個像素點周圍多少像素在內的區域做處理,ksize 越大得到的越模糊。
sigmaX 實際上是σX
,指的是在圖像 X 向的標準差,為必要參數,如果未指定σY
,則根據 X 的來設定
圖像二值化函數 threshold ()#
常用函數格式:
dst = cv.threshold(src, thresh, maxval, type)
其中 thresh 為閾值,maxval 為被設置的最大值,僅當 type 為cv.THRESH_BINARY
或cv.THRESH_BINARY_INV
時生效
type 為二值化方法,在庫中有對應值,如下所示:
cv.THRESH_BINARY
:當前點大於 thresh 時設置為 maxval 的值,否則為 0。
cv.THRESH_BINARY_INV
:當前點值大於閾值時,設置為 0,否則設置為 Maxval
THRESH_TRUNC
:當前點值大於閾值時,設置為閾值,否則不改變
THRESH_TOZERO
:當前點值大於閾值時,不改變,否則設置為 0
THRESH_TOZERO_INV
:當前點值大於閾值時,設置為 0,否則不改變
Canny 算子邊緣檢測 Canny ()#
常用函數格式:
dst = cv.Canny(src, thresh1, thresh2)
其中,像素值低於 thresh1 的會認為不是邊緣,像素值高於 thresh2 的會認為是邊緣,像素值為兩個閾值之間的像素點若與被認為是邊緣的像素點相鄰,則也被認為是邊緣。
輪廓檢測 findContours () 與輪廓繪製 drawContours ()#
常用函數格式:
contours, hierarchy = cv.findContours(src, mode, method)
dst = cv.drawContours(src, contours, contoursIdx, color, thickness)
在 findContours 中,mode 為輪廓檢索方式,例如cv.RETR_TREE
可以完全建立輪廓層級關係,method 為輪廓表示方式,例如cv.CHAIN_APPROX_SIMPLE
就是以盡量少的像素點表示輪廓。
在 drawContours 中,contours 就是上一步檢測出的輪廓,contoursIdx 指繪製的輪廓編號,若為 - 1 則是繪製所有的輪廓,color 指顏色,可以用類似 (255, 0, 0) 這樣的格式表示一個 RGB 顏色,thickness 指輪廓線的寬度,是一個非必需參數。
通常來講對邊緣檢測之後的圖進行輪廓檢測,得到的輪廓效果一般很好。
霍夫變換 HoughLines ()#
常用函數格式:
lines = cv.HoughLines(src, rho, theta,thresh)
輸出為一組檢測到的直線,rho 為以像素為單位的距離精度,theta 為以弧度為單位的角度精度,這裡使用了極座標來表示直線,thresh 為閾值。在實際使用時若無特殊情況則一般為 1, np.pi/ 180, 0
該函數用於直線檢測,應用場景為求角度進行旋正,例如以下代碼用於旋轉直線斜率對應的角度:
lines = cv.HoughLines(img_canny, 1, np.pi / 180, 0)
for rho, theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * a)
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * a)
if x1 == x2 or y1 == y2:
continue
t = float(y2 - y1) / (x2 - x1)
rotate_angle = math.degrees(math.atan(t))
img_result = ndimage.rotate(img_resize, rotate_angle)