圖像腐蝕與圖像膨脹(18)


一 基礎知識

   圖像的膨脹(dilation)和腐蝕(erosion)是兩種基本的形態學運算,主要用來尋找圖像中的極大區域和極小區域.

  其中膨脹類似與 '領域擴張' ,將圖像的高亮區域或白色部分進行擴張,其運行結果圖比原圖的高亮區域更大.

  腐蝕類似 '領域被蠶食' ,將圖像中的高亮區域或白色部分進行縮減細化,其運行結果圖比原圖的高亮區域更小.

 

二 圖像膨脹

 

膨脹的運算符是“⊕”,其定義如下:

  該公式表示用B來對圖像A進行膨脹處理,其中B是一個卷積模板或卷積核,其形狀可以為正方形或圓形,通過模板B與圖像A進行卷積計算,掃描圖像中的每一個像素點,用模板元素與二值圖像元素做“與”運算,如果都為0,那么目標像素點為0,否則為1。從而計算B覆蓋區域的像素點最大值,並用該值替換參考點的像素值實現膨脹。下圖是將左邊的原始圖像A膨脹處理為右邊的效果圖A⊕B。

  圖像中的高亮區(黑點增多)

 

三 圖像腐蝕

  腐蝕的運算符是“-”,其定義如下:

該公式表示圖像A用卷積模板B來進行腐蝕處理,通過模板B與圖像A進行卷積計算,得出B覆蓋區域的像素點最小值,並用這個最小值來替代參考點的像素值。如圖所示,將左邊的原始圖像A腐蝕處理為右邊的效果圖A-B。

處理結果如下圖所示:

 

   高亮區減少(白色區域減少)

 

四. 圖像腐蝕代碼實現

1.基礎理論

形態學轉換主要針對的是二值圖像(0或1)。圖像腐蝕類似於“領域被蠶食”,將圖像中的高亮區域或白色部分進行縮減細化,其運行結果圖比原圖的高亮區域更小。其主要包括兩個輸入對象:

(1)二值圖像

(2)卷積核

  卷積核是腐蝕中的關鍵數組,采用numpy庫可以生成。卷積核的中心點逐個像素掃描原始圖像,如下圖所示:

 

  被掃描到的原始圖像中的像素點,只有當卷積核對應的元素值均為1時,其值才為1,否則其值修改為0。換句話說,遍歷到的黃色點位置,其周圍全部是白色,保留白色,否則變為黑色,圖像腐蝕變小。

 

2.函數原型

圖像腐蝕主要使用的函數為erode,其原型如下:

dst = cv2.erode(src, kernel, iterations)

 

 

  參數

  • dst表示處理的結果,
  • src表示原圖像,kernel表示卷積核,
  • iterations表示迭代次數。

 

下圖表示5*5的卷積核,可以采用函數 np.ones((5,5), np.uint8) 構建。

注意:迭代次數默認是1,表示進行一次腐蝕,也可以根據需要進行多次迭代,進行多次腐蝕。

 

3.代碼實現

完整代碼如下所示:

 

輸出結果如下圖所示:

 

  由圖可見,干擾的細線被進行了清洗,但仍然有些輪廓,此時可設置迭代次數進行腐蝕。

 

erosion = cv2.erode(src, kernel,iterations=9)

 

 

輸出結果如下圖所示:

 

三. 圖像膨脹代碼實現

1.基礎理論

  圖像膨脹是腐蝕操作的逆操作,類似於“領域擴張”,將圖像中的高亮區域或白色部分進行擴張,其運行結果圖比原圖的高亮區域更大,線條變粗了,主要用於去噪。

  (1) 圖像被腐蝕后,去除了噪聲,但是會壓縮圖像。

  (2) 對腐蝕過的圖像,進行膨脹處理,可以去除噪聲,並且保持原有形狀。

 

它也包括兩個輸入對象:

  (1)二值圖像或原始圖像

  (2)卷積核

卷積核是腐蝕中的關鍵數組,采用numpy庫可以生成。卷積核的中心點逐個像素掃描原始圖像,如下圖所示:

 

被掃描到的原始圖像中的像素點,當卷積核對應的元素值只要有一個為1時,其值就為1,否則為0。

 

2.函數原型

  圖像膨脹主要使用的函數為dilate,其原型如下:

dst = cv2.dilate(src, kernel, iterations)

 

 

參數

dst表示處理的結果,

src表示原圖像,

kernel表示卷積核,

iterations表示迭代次數。

 

下圖表示5*5的卷積核,可以采用函數 np.ones((5,5), np.uint8) 構建。

注意:迭代次數默認是1,表示進行一次膨脹,也可以根據需要進行多次迭代,進行多次膨脹。通常進行1次膨脹即可。

 

3.代碼實現

完整代碼如下所示:

 

輸出結果如下所示:

 

圖像去噪通常需要先腐蝕后膨脹,這又稱為開運算.

erosion = cv2.erode(src, kernel)

result = cv2.dilate(erosion, kernel)

 

 

四 黑帽、頂帽

 

 

代碼層面

import cv2 as cv
import numpy as np

def top_hat_demo(image):
    '頂帽'
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #構建形態學元素 提高內核矩陣(10,10)可以提取更多元素
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(10,10))
    #黑帽處理
    dst=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)

    #如果圖像較黑可以用圖像增強看看效果
    cimage=np.array(gray.shape,np.uint8)
    cimage=50
    dst=cv.add(dst,cimage)

    cv.imshow('top_hat',dst)

def black_hat_demo(image):
    '黑帽'
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #構建形態學元素 提高內核矩陣(10,10)可以提取更多元素
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(10,10))
    #黑帽處理
    dst=cv.morphologyEx(gray,cv.MORPH_BLACKHAT,kernel)

    #如果圖像較黑可以用圖像增強看看效果
    cimage=np.array(gray.shape,np.uint8)
    cimage=50
    dst=cv.add(dst,cimage)

    cv.imshow('black_hat',dst)

src = cv.imread("girl.jpg")
cv.imshow("原來", src)
# black_hat_demo(src)
top_hat_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

效果展示

 

五 圖像頂帽運算

1.基本原理  

  圖像頂帽(或圖像禮帽)運算是原始圖像減去圖像開運算的結果,得到圖像的噪聲。如下圖所示:

頂帽運算(img) = 原始圖像(img) - 開運算(img) 

 

2.函數原型
圖像開運算主要使用的函數morphologyEx,它是形態學擴展的一組函數,其參數

dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

 

參數

dst表示處理的結果,

src表示原圖像,

cv2.MORPH_TOPHAT表示頂帽運算,

kernel表示卷積核。

 

下圖表示5*5的卷積核,可以采用函數 np.ones((5,5), np.uint8) 構建。

 

卷積如下圖所示:

3.代碼實現

完整代碼如下所示:

#encoding:utf-8
import cv2  
import numpy as np  

#讀取圖片
src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像頂帽運算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

輸出結果如下圖所示,可以看到外部噪聲被提取出來。


  如果想獲取更多的細節,可以將卷積設置為10*10,如下圖所示:

kernel = np.ones((10,10), np.uint8)
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

 

二. 圖像黑帽運算

1.基本原理

  圖像黑帽運算是圖像閉運算操作減去原始圖像的結果,得到圖像內部的小孔,或者前景色中的小黑點。如下圖所示:

黑帽運算(img) = 閉運算圖像(img) - 原始圖像(img) 

 

2.函數原型

  圖像開運算主要使用的函數morphologyEx,它是形態學擴展的一組函數,其參數cv2.MORPH_BLACKHAT對應開運算。其原型如下:

dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

 

參數

  • dst表示處理的結果,
  • src表示原圖像,
  • cv2.MORPH_BLACKHAT表示黑帽運算,
  • kernel表示卷積核。

 

下圖表示5*5的卷積核,可以采用函數 np.ones((5,5), np.uint8) 構建。

 

3.代碼實現

完整代碼如下所示:

import cv2  
import numpy as np  

#讀取圖片
src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像黑帽運算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

輸出結果如下圖所示,可以看到圖像內部黑點被提取出來。


  但內部比較大的四個黑點沒有被提取,如果想獲取更多的細節,可以將卷積設置為10*10,如下圖所示:

kernel = np.ones((10,10), np.uint8)
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

 

轉載:

https://blog.csdn.net/Eastmount/article/details/83692456




免責聲明!

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



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