形態學操作其實就是改變物體的形狀,一般作用於二值化圖,來連接相鄰的元素或分離成獨立的元素。
腐蝕的原理是在原圖的小區域內取局部最小值。因為是二值化圖,只有0和255,所以小區域內有一個是0該像素點就為0
膨脹的原理是在原圖的小區域內取局部最大值
腐蝕與膨脹的python實現
import cv2 """ 腐蝕算法:變瘦 用kernel,掃描圖像的每一個像素;用kernel與其覆蓋的二值圖像做 “與” 操作;如果都為1,結果圖像的該像素為1;否則為0. 結果:使二值圖像減小一圈 """ def erode_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)) dst = cv2.erode(binary, kernel) cv2.imshow("erode", dst) """ 膨脹算法:變胖 用kernel,掃描圖像的每一個像素;用kernel與其覆蓋的二值圖像做 “與” 操作;如果都為0,結果圖像的該像素為0;否則為1. 結果:使二值圖像擴大一圈 """ def dilate_demo(image): print(image.shape) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY) cv2.imshow("binary", binary) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) dst = cv2.dilate(binary, kernel) cv2.imshow("dilate", dst) if __name__ == "__main__": img = cv2.imread("img.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) erode_demo(img) dilate_demo(img) cv2.waitKey(0) cv2.destroyAllWindows() # img = cv2.imread("image/123.jpg") # cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE) # cv2.imshow("input image",img) # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # dst = cv2.erode(img, kernel) # 腐蝕 # dst1 = cv2.dilate(img, kernel) # 膨脹 # cv2.imshow("erode result", dst) # cv2.imshow("dilate result", dst1) # cv2.waitKey(0) # cv2.destroyAllWindows()
運行結果如下
可以不進行灰度處理,直接對彩色圖像進行腐蝕和膨脹處理,結果如下
腐蝕函數cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
膨脹函數cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
獲取不同形狀的結構元素cv2.getStructuringElement(shape, ksize, anchor=None),返回指定形狀和尺寸的結構元素
參數shape:表示內核的形狀,矩形:MORPH_RECT 十字形:MORPH_CORSS 橢圓形:MORPH_ELLIPSE;
參數ksize:是內核的尺寸(n,n)
參數anchor:錨點的位置