Python+OpenCV圖像處理之腐蝕與膨脹


形態學操作其實就是改變物體的形狀,一般作用於二值化圖,來連接相鄰的元素或分離成獨立的元素。

腐蝕的原理是在原圖的小區域內取局部最小值。因為是二值化圖,只有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:錨點的位置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM