一、形態學變化
????????形態學變換(Morphological Transformations)是一種基于形狀的圖像處理技術,主要處理的對象為二值化圖像。
????????形態學變換有兩個輸入和一個輸出:輸入為原始圖像和核(即結構化元素),輸出為經過形態學變換后的圖像。
????????其基本操作包括腐蝕(Erosion)和膨脹(Dilation),這兩種操作互為反向過程,分別對圖像中的亮度值產生不同的影響。
二、核
????????核,或稱結構化元素,是用于形態學變換的一個小的二值圖像,通常呈現為簡單的幾何形狀,例如矩形、橢圓形或十字形等。結構化元素的大小和形狀直接影響腐蝕和膨脹操作的效果。
2.1、矩形
2.2、橢圓形
2.3、十字形
三、腐蝕
????????腐蝕操作就是使用核在原圖(二值化圖)上進行從左到右、從上到下的滑動(也就是從圖像的左上角開 始,滑動到圖像的右下角)。在滑動過程中,令核值為1的區域與被核覆蓋的對應區域進行相乘,得到其 最小值,該最小值就是卷積核覆蓋區域的中心像素點的新像素值,接著繼續滑動。由于操作圖像為二值 圖,所以不是黑就是白,這就意味著,在被核值為1覆蓋的區域內,只要有黑色(像素值為0),那么該 區域的中心像素點必定為黑色(0)。這樣做的結果就是會將二值化圖像中的白色部分盡可能的壓縮,如 下圖所示,該圖經過腐蝕之后,“變瘦”了。
?導入模塊
import cv2
?讀取圖片
img=cv2.imread('img.png')
?灰度化
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
?二值化
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
?創建核
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))
?腐蝕
img_erode=cv2.erode(img_threshold,kernel)
?顯示圖片
cv2.imshow('img_gray',img_gray)
cv2.imshow('img_erode',img_erode)
cv2.waitKey(0)
?完整代碼
import cv2 # 導入OpenCV庫 # 讀取圖像
img = cv2.imread('img.png') # 將圖像轉換為灰度圖
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 對灰度圖像應用閾值處理,以獲得二值圖像
# ret: 用于輸出閾值值,img_threshold: 閾值處理后的圖像
ret, img_threshold = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) # 創建一個15x15的十字形結構元素(腐蝕操作所用的卷積核)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15)) # 對閾值處理后的圖像進行腐蝕操作
img_erode = cv2.erode(img_threshold, kernel) # 顯示腐蝕處理后的圖像
cv2.imshow('img_erode', img_erode) # 等待用戶按鍵后關閉窗口
cv2.waitKey(0)
四、膨脹
????????膨脹與腐蝕剛好相反,膨脹操作就是使用核在原圖(二值化圖)上進行從左到右、從上到下的滑動(也 就是從圖像的左上角開始,滑動到圖像的右下角),在滑動過程中,令核值為1的區域與被核覆蓋的對應 區域進行相乘,得到其最大值,該最大值就是核覆蓋區域的中心像素點的新像素值,接著繼續滑動。由 于操作圖像為二值圖,所以不是黑就是白,這就意味著,在卷積核覆蓋的區域內,只要有白色(像素值 為255),那么該區域的中心像素點必定為白色(255)。這樣做的結果就是會將二值化圖像中的白色部 分盡可能的擴張,如下圖所示,該圖經過腐蝕之后,“變胖”了。
導入模塊
import cv2
?讀取圖片
img=cv2.imread('img.png')
?灰度化
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
?二值化
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
?創建核
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))
?膨脹
img_dilate=cv2.dilate(img_threshold,kernel)
?顯示圖片
cv2.imshow('img_dilate',img_dilate)
cv2.waitKey(0)
完整代碼?
import cv2 # 導入OpenCV庫 # 讀取圖像
img = cv2.imread('img.png') # 將圖像轉換為灰度圖
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 對灰度圖像應用閾值處理,以獲得二值圖像
# ret: 用于輸出閾值值,img_threshold: 閾值處理后的圖像
ret, img_threshold = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) # 創建一個15x15的十字形結構元素(膨脹操作所用的卷積核)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15)) # 對閾值處理后的圖像進行膨脹操作
# 膨脹會增強圖像中亮區域的大小
img_dilate = cv2.dilate(img_threshold, kernel) # 顯示膨脹處理后的圖像
cv2.imshow('img_dilate', img_dilate) # 等待用戶按鍵后關閉窗口
cv2.waitKey(0)
五、庫函數
5.1、getStructuringElement()
cv.getStructuringElement( shape, ksize[, anchor] ) -> retval
方法 | 描述 |
---|---|
shape | 可以是?MorphShapes?之一 |
ksize | 結構元素的大小。 |
anchor | 元素內的錨點位置。默認值(?1,?1)表示錨點位于中心。請注意,只有十字形元素的形狀取決于錨點位置。在其他情況下,錨點只是調節形態作的結果偏移了多少 |
MorphShapes | |
MORPH_RECT Python:cv.MORPH_RECT | 矩形結構元素: |
MORPH_CROSS Python:cv.MORPH_CROSS | 十字形結構元件: |
MORPH_ELLIPSE Python:cv.MORPH_ELLIPSE | 橢圓結構元素,即內接到矩形 Rect(0, 0, esize.width, esize.height) 中的填充橢圓 |
5.2、erode()
cv.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
方法 | 描述 |
---|---|
src | 輸入圖像;通道數可以是任意的,但深度應該是 CV_8U、 CV_16U、 CV_16S、 CV_32F 或 CV_64F 之一。 |
dst | 輸出圖像的大小和類型與 src 相同。 |
kernel | 用于侵蝕的結構元件;如果 ,則使用矩形結構元素。可以使用?getStructuringElement?創建 Kernel。element=Mat() 3 x 3 |
anchor | 錨點在元素中的位置;默認值 (-1, -1) 表示錨點位于元素中心。 |
iterations | 應用 腐蝕的次數。 |
borderType | 像素外插方法,請參閱?BorderTypes。不支持BORDER_WRAP。 |
borderValue | border 值(如果邊界為常量) |
5.3、?dilate()
cv.dilate( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
方法 | 描述 |
---|---|
src | 輸入圖像;通道數可以是任意的,但深度應該是 CV_8U、 CV_16U、 CV_16S、 CV_32F 或 CV_64F 之一。 |
dst | 輸出圖像的大小和類型與 src 相同。 |
kernel | 用于擴張的結構元件;如果 element=Mat(),則使用 3 x 3 矩形結構元素。可以使用?getStructuringElement?創建 Kernel |
anchor | 錨點在元素中的位置;默認值 (-1, -1) 表示錨點位于元素中心。 |
iterations | 應用擴張的次數。 |
borderType | 像素外插方法,請參閱?BorderTypes。不支持BORDER_WRAP。 |
borderValue | border 值(如果邊界為常量) |