傳統圖像處理 --二值形態學

https://blog.csdn.net/u014453898/article/details/105525651

一、原理

無論是膨脹還是腐蝕,都是對白色區域(明亮區域)而言的。膨脹或者腐蝕操作都會有一個核,核的形狀可以是圓形或者正方形,核在輸入圖像上滑動。膨脹是用核與二值圖像元素做“與”運算,如果都爲0,那麼目標像素點爲0,否則爲1,這樣的將會擴大1的區域,達到膨脹白色區域(明亮區域)的目的。腐蝕操作則相反,如果核與其覆蓋區域都爲1,那麼目標像素點爲1,否則爲0,這樣達到的效果是白色區域(明亮區域)會被削減,即腐蝕。

 

二、對灰度圖或者二值圖

對於灰度圖和二值圖:

膨脹:

膨脹可以擴大細節性特徵,如:

左圖是原圖,我們可以看到周邊其實是有一小圈紅色圈的,經過膨脹操作後,即右圖,紅色圈更明顯了。而且也符合膨脹原理,右圖更加強調了明亮區域。

而且膨脹還有去除噪聲的作用,如下圖:

左邊是原圖,經過膨脹操作後,很多小點都沒了,當然比較大的點還是有的,(下面會有更好的解決方法)。但是也可以通過修改迭代次數來解決這個問題,迭代次數就是核在在圖片上遍歷的次數,若迭代次數爲1,那核就會從左到右,上到下劃完整張圖片一次,若迭代次數是 2,則會滑2次。一般默認的迭代次數是1。那我們看看把迭代次數修改成2後的效果:

黑洞是沒了,但是可以看到,整個 j 也大了不少,因爲膨脹了兩次嘛。

 

腐蝕:

腐蝕可以去掉細節性特徵:

如下圖:

我們可以看到,一些毛刺沒了,但是 j 也變得更小了,當然腐蝕也是可以增加迭代次數的。

我們看到下圖,通過一次迭代後,一些細線沒了。

然後我們試試把迭代次數改成8.

我們可以看到,連比較粗的線條都沒有了。

 

三,對RGB圖:

膨脹:

對於RGB圖而言,膨脹會更多地保留明暗區域。(迭代次數爲1)

迭代次數爲5:

 

腐蝕:

對於RGB圖而言,腐蝕則是更多地保留暗區域:(迭代次數爲1)

迭代次數爲5:

 

四,膨脹和腐蝕代碼:

膨脹代碼:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    kernel = np.ones((5,5),np.uint8)  #設置核的尺寸爲 5x5
    dialate = cv2.dilate(src,kernel,iterations=5)
    cv2.imshow("src",src)
    cv2.imshow("result",dialate)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

腐蝕代碼:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    kernel = np.ones((5,5),np.uint8)  #設置核的尺寸爲 5x5
    erosion = cv2.erode(src,kernel,iterations=1)
    #print(erosion)
    cv2.imshow("src",src)
    cv2.imshow("result",erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

五,開運算和閉運算

1)開運算:先對圖像腐蝕後膨脹。

作用:消除主體外的瑕疵部分,但不改變主體物體大小,不像腐蝕,雖然腐蝕可以消除瑕疵部分,但是主體部分也會變小。

但是開運算不適宜消除主體內的瑕疵:

可以看到,對主體內的瑕疵,開運算的效果並不行。

對於RGB圖片,開運算的先腐蝕再膨脹,會使明亮部分丟失,所以圖片會比較凸顯顏色較暗的特徵:

代碼:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\holej.jpg')
    kernel = np.ones((5,5),np.uint8)  #設置核的尺寸爲 5x5
    res = cv2.erode(src,kernel,iterations=1)  #腐蝕
    res = cv2.dilate(res,kernel,iterations=1)  #膨脹
    cv2.imshow("src",src)
    cv2.imshow("result",res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2)閉運算:先對圖像膨脹後腐蝕

作用:用來填充物體內的小空洞,連接鄰近的物體,連接斷開的輪廓線,平滑其邊界的同時不改變面積。

但是可以見到還是有瑕疵,我們接着把,腐蝕和膨脹的迭代次數提高到2:

可以看到瑕疵空洞已經沒了。

對於RGB圖片,閉運算的先膨脹再腐蝕,會使明亮部分增強,所以圖片會比較凸顯顏色較亮的特徵:

代碼:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    #src = cv2.resize(src,(512,512))
    kernel = np.ones((5,5),np.uint8)  #設置核的尺寸爲 5x5
    res=src
    res = cv2.dilate(res,kernel,iterations=1)
    res = cv2.erode(res,kernel,iterations=1)
     
    cv2.imshow("src",src)
    cv2.imshow("result",res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

六、黑帽和頂帽

1)黑帽:

黑帽圖像 = 閉運算圖像 - 原圖像

作用:得到前景中的瑕疵(小孔)

對於RGB圖片:

代碼:

    import cv2
    import numpy as np
    def black_hat_demo(image):
        '黑帽'
        gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        kernel = np.ones((5, 5), np.uint8)
     
        open = cv2.erode(cv2.dilate(gray,kernel,iterations=2),kernel,iterations=2)
        cv2.imshow("close",open)
     
        #黑帽處理
        dst=cv2.morphologyEx(gray,cv2.MORPH_BLACKHAT,kernel,iterations=2)
        cv2.imshow('black_hat',dst)
     
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\holej.jpg')
    cv2.imshow("src", src)
    black_hat_demo(src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2)頂帽

頂帽圖像 = 原始圖像 - 開運算圖像

作用:得到前境外的瑕疵

對於RGB圖片:

代碼:

    import cv2
    import numpy as np
     
    def top_hat_demo(image):
        '頂帽'
        gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        kernel = np.ones((5, 5), np.uint8)
        open = cv2.dilate(cv2.erode(gray, kernel, iterations=2), kernel, iterations=2)
        cv2.imshow("open", open)
     
        dst = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, kernel, iterations=2)
        cv2.imshow('top_hat', dst)
     
     
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    src = cv2.resize(src,(512,512))
    cv2.imshow("src", src)
    top_hat_demo(src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
https://blog.csdn.net/u014453898/article/details/105525651

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章