理論
形態變換是一些基於圖像形狀的簡單操作。它通常在二進製圖像上執行。它需要兩個輸入,一個是我們的原始圖像,第二個稱為結構元素或內核,它決定了操作的性質。兩個基本的形態學算子是侵蝕和膨脹。然後它的變體形式如開、閉、梯度等也開始發揮作用。我們將在下圖的幫助下一一看到它們:
侵蝕cv.erode
侵蝕的基本思想就像土壤侵蝕一樣,它侵蝕掉前景物體的邊界(總是盡量讓前景保持白色)。那它有什麼作用呢?內核在圖像中滑動(如在 2D 卷積中)。只有當內核下的所有像素都為 1 時,原始圖像中的像素(1 或 0)才會被認為是 1,否則它會被腐蝕(變為零)。
所以發生的事情是,根據內核的大小,邊界附近的所有像素都將被丟棄。因此,前景對象的厚度或大小會減少,或者圖像中的白色區域會減少。它對於去除小的白噪聲(正如我們在色彩空間章節中看到的)、分離兩個連接的對像等很有用。
在這裡,作為一個例子,我會使用一個 5×5 的內核。讓我們看看它是如何工作的:
1 2 3 4 5 |
import cv2 as cv import numpy as np img = cv.imread('j.png',0) kernel = np.ones((5,5),np.uint8) erosion = cv.erode(img,kernel,iterations = 1) |
膨脹Dilation
它與侵蝕正好相反。這裡,如果內核下的至少一個像素為“1”,則像素元素為“1”。因此它增加了圖像中的白色區域或前景對象的大小增加。通常,在去除噪聲等情況下,腐蝕之後是膨脹。因為,腐蝕去除了白噪聲,但它也縮小了我們的對象。所以我們擴大它。由於噪音消失了,它們不會回來,但我們的對象區域增加了。它還可用於連接對象的損壞部分。
1 |
dilation = cv.dilate(img,kernel,iterations = 1) |
去噪cv.MORPH_OPEN
在去除噪聲方面很有用。這裡我們使用函數cv.morphologyEx()
1 |
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel) |
關閉線條
對關閉前景對象內的小孔或對像上的小黑點很有用。這個我也有使用來把canny所找到的邊緣關起來
1 |
closing = cv.morphologyEx (img, cv.MORPH_CLOSE, kernel) |
形態梯度
這是圖像膨脹和腐蝕之間的區別。結果將看起來像對象的輪廓。
1 |
gradient = cv.morphologyEx (img, cv.MORPH_GRADIENT, kernel) |
Top Hat
使用cv.MORPH_TOPHAT
1 |
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel) |
Black Hat
使用cv.MORPH_GRADIENT
1 |
gradient = cv.morphologyEx (img, cv.MORPH_GRADIENT, kernel) |