開操作:圖像形態學的重要操縱之一,基於膨脹與腐蝕操作組合形成的;主要是應用在二值圖像分析中,灰度圖像亦可
開操作 = 腐蝕+膨脹 ,輸入圖像 + 結構元素
作用:用來消除小物體、平滑較大物體的邊界的同時並不明顯改變其面積,提取水平或豎直的線
閉操作:圖像形態學的重要操縱之一,基於膨脹與腐蝕操作組合形成的;主要是應用在二值圖像分析中,灰度圖像亦可
閉操作 = 膨脹+腐蝕 ,輸入圖像 + 結構元素
作用:用來填充物體內細小空洞、連接鄰近物體、平滑其邊界的同時並不明顯改變其面積
python實現
import cv2 def open_demo(image): print(image.shape) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) cv2.imshow("binary", binary) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) cv2.imshow("open result", binary) def close_demo(image): print(image.shape) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) cv2.imshow("binary", binary) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) cv2.imshow("close result", binary) if __name__ == "__main__": img = cv2.imread("image/open.jpg") cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) open_demo(img) cv2.waitKey(0) cv2.destroyAllWindows()
開操作結果,盡量保留其他結構元素不變,消除小物體
當我們改變內核的大小,就能達到不同的效果,比如我們設置ksize=(15,1),就可以提取圖像中的水平直線
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 1))
binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
同理,我們讓ksize=(1,15),就可以提取圖像中的垂直直線。結果如下
閉操作結果,填充封閉區域,其他保持不變
當我們改變內核的形狀,也能達到不同的效果,比如提取圖像中的圓
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
結果如下
src參數:輸入圖像
op參數:操作類型
MORTH_OPEN 函數做開運算
MORTH_CLOSE 函數做閉運算
MORTH_GRADIENT 函數做形態學梯度運算
MORTH_TOPHAT 函數做頂帽運算
MORTH_BLACKHAT 函數做黑帽運算
MORTH_DILATE 函數做膨脹運算
MORTH_ERODE 函數做腐蝕運算
kernel參數 :內核類型,用getStructuringElement函數得到