getStructuringElement() 與 morphologyEx() 兩個函數使用時,經常是放在一起的,后者函數中用到的參數是由前者提供
- cv2.getStructuringElement()
- 返回一個特定大小與形狀的結構元素用於形態學操作,生成的結構學元素進一步傳入 Opencv 的
erode、dilate、morphologyEx
函數中完成形態學操作,除此之外,也可以自己構建一個任意形狀的二進制掩碼,作為結構元素
- 返回一個特定大小與形狀的結構元素用於形態學操作,生成的結構學元素進一步傳入 Opencv 的
參數詳講
shape
: 元素形狀,OpenCV 中提供了三種,MORPH_RECT(矩陣)
,MORPH_CORSS(交叉形狀)
,MORPH_ELLIPSE(橢圓)
;ksize
,結構元素的大小;anchor
,元素內的描點位置,默認為(-1,-1)
表示形狀中心;值得注意的時,只有MORPH-CROSS
形狀依賴 描點位置,其它情況 描點僅調節其他形態運算結果偏移了多少
使用命令
retval = cv.getStructuringElement( shape, ksize[, anchor] )
morphologyEx()
語法命令
dst =cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
對圖像進行形態學轉換;利用最基本腐蝕、膨脹形態學操作;所有操作可直接在源圖像上實現,針對多通道圖像,其中每個通道都是獨立處理,這個方法常用來提取圖像中某類不規則形狀的區域
參數解析
src
,預處理的圖像;op
,形態操作的類型,可選擇下面列表中的一種類型,一般參數多選為cv2.MORPH_CLOSE
kernel
: 結構元素,來自於getStructuringElement
方法
針對上面這兩種方法的用法,這里給一個例子,提取下方圖片中水印部分,也就是中間黑色圓環,和下方字體
例子代碼用到的代碼如下
import cv2
import numpy as np
if __name__ =='__main__':
img_path = "F:/Data/Ceshi1/shuiyin.jpg"
im = cv2.imread(img_path)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
background = gray.copy()
for i in range(1,5):
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*i+1,2*i+1))
# print('kernel size is ',kernel)
background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)
background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)
cv2.namedWindow('diff',cv2.WINDOW_FREERATIO) # 獲取圖像中前景背景之差
cv2.imshow('diff',background)
代碼中用了一個 for 循環,用來控制提取圖像不規則形狀的次數,可以根據結果確定一個比較好的值,最終實驗證明了 4
為最合適的
最終提取結果如下