banner
月落星河Tsukistar

月落星河Tsukistar

浩瀚中的伟大,孤独间的渺小
github
twitter
youtube
bilibili
email

opencv-python圖像處理常用方法整理(一)

封面圖片由PexelsPixabay上發布,本人添加了 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_BINARYcv.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)
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。