形態變換
- 形態變換
- 腐蝕
- 膨脹
- 高級形態操作
- 開運算
- 閉運算
- 形態學梯度運算
- 黑帽運算
- 禮帽運算
- 高級形態操作總結
- 代碼素材
形態變換
\qquad
形態變換主要用于二值影像的形狀操作,形態變換的實作原理基于數字形態學,數字形態學也稱形態學,它主要從影像內部提取資訊來描述影像形態,例如,通過形態運算獲取手寫文字的骨架資訊,數字形態學廣泛應用于視覺檢測、文字識別、醫學影像處理、影像壓縮編碼等領域,形態變換主要包括腐蝕、膨脹和高級形態學操作(開運算,閉運算等),
\qquad
腐蝕和膨脹是數學形態學最基本的變換,膨脹就是把連接成分的邊界擴大一層的處理,而收縮則是把連接成分的邊界點去掉從而縮小一層的處理,對于二值影像來說,簡單的腐蝕是消除物體的所有邊界點的一種程序,其結果是使剩下的物體沿其周邊比原物體小—個像素的面積,如果物體是圓的,它的直徑在每次腐蝕后將減少兩個像素,如果物體在某一點處任意方向上連通的像素小于 3 個,那么該物體經過一次腐蝕后將在該點處分裂為兩個物體,簡單的膨脹運算是將與某物體接觸的所有背景點合并到該物體中的程序,膨脹的結果是使物體的面積增大相應數量的點,如果物體是圓的,它的直徑在每次膨脹后將增大兩個像素,如果兩個物體在某一點的任意方向相隔少于 3 個像素,它們將在該點連通起來,
\qquad
開運算是先對且標影像進行腐蝕操作,后進行膨脹操作,用來消除小物體,平滑較大物體邊界的同時不明顯改變其面積,開運算通常是在需要去除小顆粒噪聲,以及斷開目標物之間粘連時使用,其主要作用與腐蝕相似,與腐蝕操作相比,具有可以基本保持目標原有大小不變的優點,閉運算則是先對目標影像進行膨脹操作,后進行腐蝕操作,常用來填充物體內細小空洞,連接鄰近物體,平滑其邁界,同時不明顯改變其面積,
\qquad
形態操作會使用一個內核(也稱結構元)遍歷影像,根據內核和影像的位置關系決定內核中心對應的影像像素點的輸出結果,內核可以是自定義的矩陣(NumPy陣列),也可以是 cv2.getSinucturingElement()函式回傳的矩陣,
cv2.getStructuringElement()函式的基本格式如下:
retval=cv2.getStructuringElement(shape,ksize)
其引數說明如下:
| 引數 | 說明 |
|---|---|
| shape | 為內核的形狀,可使用的常量包括 cv2.MORPH_RECT(矩形)、cv2.MORPH_CROSS(十字形)和 cv2.MORPH_ELLIPSE(橢圓形) |
| ksize | 為內核的大小 |
import cv2
import numpy as np
print(cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))) # 回傳矩形內核
print(cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))) # 回傳十字形內核
print("自定義內核") # 自定義內核
kernel = np.ones((5, 5), np.uint8) # 自定義矩形內核
print(kernel)

腐蝕
\qquad
腐蝕操作遍歷影像時,會根據內核和影像的位置決定內核中心對應的影像像素點的輸出結果,在下圖所示的示意圖中,0 表示背景,1 表示前景,灰色方塊表示大小為 3× 3 的矩形內核,執行腐蝕操作時,依次將內核中心對準每一個單元格,根據內核和前景的未知關系決定當前單元格的值,
1.當內核部分或全部處于前景之外時,內核中心對應單元格的值設定為 0,如圖 (a)所示,
2.只有在內核完全出喲前景內部時, 內核中心對應單元格的值才設定為1,如圖(b)所示,
通過腐蝕操作,影像的邊界被侵蝕, 白色區域縮小,腐蝕結果如圖(c)所示,

OpenCV 的 cv2.erode()函式用于實作腐蝕操作,其基本格式如下:
dst=cv2.erode(src,kernel[,anchor[,iterations[,borderType[,porderValue]]]])
其引數說明如下:
| 引數 | 說明 |
|---|---|
| dst | 為轉換后的結果影像 |
| src | 為原影像 |
| kernel | 為內核 |
| anchor | 為錨點,默認值為(-1,-1),表示錨點為內核中心 |
| iterations | 為腐蝕操作的迭代次數 |
| borderType | 為邊界型別,默認為 BORDER_CONSTANT |
| borderValue | 為邊界值,一般由 OpenCV 自動確定 |
import cv2
import numpy as np
img = cv2.imread('zh2.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
img2 = cv2.erode(img, kernel, iterations=1) # 腐蝕,迭代1次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

膨脹
\qquad
膨脹操作與腐蝕操作剛好相反,它對影像的邊界進行擴張,其執行遍歷操作時,只有在內核完全
處于前景外部時,內核中心對應像素點的值才設定為0,否則設定為1,在下圖所示的示意圖中,0表示背景,1表示前景,灰色方塊表示大小為3×3的矩形內核,執行膨脹操作時,依次將內核中心對準每一個單元格,根據內核和前景的位置關系決定當前單元格的值,
1.只有在內核完全處于前景外部時,內核中心對應單元格的值才設定為0,如圖(a)所示,
2.內核部分在前景內時,內核中心對應單元格的值設定為1,如圖(b)所示,
通過膨脹操作,影像的邊界被擴張,白色區域增大,膨脹結果如圖(c)所示,

OpenCV的cv2.dilate()函式用于實作膨脹操作,其基本格式如下:
dst=cv2.dilate(src,kernel,anchor,iterations,borderType,borderValue)
各個引數的含義與cv2.erode()函式中的一致,
import cv2
import numpy as np
img = cv2.imread('zh.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
img2 = cv2.dilate(img, kernel, iterations=2) # 膨脹,迭代2次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

如果覺得上面的文字不好理解腐蝕和膨脹操作,可以結合下面的動態視頻來理解
腐蝕和膨脹影片演示
高級形態操作
\qquad 高級形態操作基于腐蝕和膨脹操作,包括開運算、閉運算、形態學梯度運算、黑帽運算和禮帽運算等,OpenCV的cv2.morphologyEx()函式用于實作形態學操作,其基本格式如下:
dst=cv2.morphologyEx(src,op,kernel,anchor,iterations,borderType,borderValue)
其中op為形態操作型別,op引數值cv2.MORPH_ERODE時執行腐蝕操作,op引數值為cv2.MORPH_DILATE時執行膨脹操作,其他引數與cv2.erode()函式中的一致,
開運算
開運算將先對影像執行腐蝕操作,再對腐蝕結果執行膨脹操作,
cv2.morphologyEx()函式的op引數值為cv2.MORPH_OPEN時,執行形態學的開運算操作
import cv2
import numpy as np
img = cv2.imread('zh2.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
op = cv2.MORPH_OPEN # 設定形態操作型別
img2 = cv2.morphologyEx(img, op, kernel, iterations=2) # 形態操作,迭代2次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

閉運算
閉運算與開運算相反,它先對影像執行膨脹操作,再對膨脹結果執行腐蝕操作,
cv2.morphologyEx()函式的op引數值為cv2.MORPH_CLOSE時,執行形態學的閉運算操作
import cv2
import numpy as np
img = cv2.imread('zh.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
op = cv2.MORPH_CLOSE # 設定形態操作型別
img2 = cv2.morphologyEx(img, op, kernel, iterations=5) # 形態操作,迭代5次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

形態學梯度運算
形態學梯度運算原理是用影像的膨脹操作結果減去腐蝕操作結果,
cv2.morphologyEx()函式的op引數值為cv2.MORPH_GRADIENT時,執行形態學梯度運算操作
import cv2
import numpy as np
img = cv2.imread('zh.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
op = cv2.MORPH_BLACKHAT # 設定形態操作型別
img2 = cv2.morphologyEx(img, op, kernel, iterations=5) # 形態操作,迭代5次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

黑帽運算
黑帽運算原理是用影像的閉運算結果減去原影像,
cv2.morphologyEx()函式的op引數值為cv2.MORPH_BLACKHAT時,執行形態學的黑帽運算操作
import cv2
import numpy as np
img = cv2.imread('zh.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
op = cv2.MORPH_BLACKHAT # 設定形態操作型別
img2 = cv2.morphologyEx(img, op, kernel, iterations=5) # 形態操作,迭代5次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

禮帽運算
禮帽運算原理是用原影像減去影像的開運算結果,
cv2.morphologyEx()函式的op引數值為cv2.MORPH_TOPHAT時,執行形態學的禮帽運算操作
import cv2
import numpy as np
img = cv2.imread('zh.jpg') # 讀取影像
cv2.imshow('img', img) # 顯示原影像
kernel = np.ones((5, 5), np.uint8) # 定義5×5核心
op = cv2.MORPH_TOPHAT # 設定形態操作型別
img2 = cv2.morphologyEx(img, op, kernel, iterations=2) # 形態操作,迭代2次
cv2.imshow('img2', img2) # 顯示轉換結果影像
cv2.waitKey(0)

高級形態操作總結
| 形態操作 | 優點 |
|---|---|
| 開運算 | 先腐蝕后膨脹,可以用來消除小物體,在纖細點處分離物體,并且在平滑較大物體的邊界的同時不明顯改變其面積 |
| 閉運算 | 先膨脹后腐蝕,,可以用來排除小型黑洞(黑色區域) |
| 形態學梯度運算 | 膨脹圖和腐蝕圖之差,對二值影像進行這一操作,可以將團塊(blob)的邊緣突出出來,保留物體的邊緣輪廓 |
| 禮帽運算 | 原影像和開運算結果圖之差,常用來分離比鄰近點亮一些的斑塊,在一幅影像具有大幅的背景而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取 |
| 黑帽運算 | 閉運算結果圖和原影像之差,突出了比原影像輪廓周圍的區域更暗的區域,所以用來分離比鄰近點暗一些的斑塊,效果圖有著非常完美的輪廓 |
代碼素材

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321483.html
標籤:其他
