详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
圖像形態學中兩種最基本的操作就是對圖形的腐蝕和膨脹,可以說,形態學中的中高級操作都是建立在這兩種操作之上。通過這兩種基本的運算可以去除圖像中的噪聲,分割出獨立的區域或者將兩個區域連接在一起。
關于圖像腐蝕和膨脹的概念,不嚴謹的簡單理解是:經過腐蝕和膨脹操作后最終的效果是對圖像中物體的邊界進行一層一層的腐蝕和膨脹操作,這個邊界包括內邊界和外邊界。
嚴謹的理解是這樣的:圖像的腐蝕和膨脹實際上是用某種形狀的窗去遍歷圖像中的每一個元素,并用這個形狀中的最大值或最小值做為錨點的值(錨點的概念可參考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/124173092)。若取的是最大值,則是膨脹操作,若取的是最小值,則是腐蝕操作。這里某種形狀可以是十字形、菱形、矩形、X形等。這里我補充說明一下,其實所有的窗都是矩形的,那么怎樣定義不同的形狀呢?是這樣操作的:通過把矩形窗中的元素置為1形成不同的形狀。更詳細的說明可見本文下面對函數getStructuringElement()參數shape的介紹。
OpenCV提供了函數erode()和函數dilate()分別用于圖像形態學的腐蝕與膨脹操作,下面分別介紹。
函數dilate()的數學運算表達式如下:
dst ( x , y ) = min ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=min(x′,y′):element(x′,y′)?=0?src(x+x′,y+y′)
其中(x’,y’)是窗中的元素坐標。
函數erode()的數學運算表達式如下:
dst ( x , y ) = max ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=max(x′,y′):element(x′,y′)?=0?src(x+x′,y+y′)
其中(x’,y’)是窗中的元素坐標。
圖像形態學的腐蝕操作函數erode()的原型如下:
void erode( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );圖像形態學的腐蝕操作函數dilate()的原型如下:
void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );可見,兩個函數的原型除了函數名不一樣,其它都是一樣的,所以我們就統一介紹兩個函數參數的意義。
參數意義如下:
src—輸入圖像,通道數任意,數據深度只能為 CV_8U, CV_16U, CV_16S, CV_32F,CV_64F中的一種。每個通道將被單獨處理。
ds—為輸出圖像,尺寸和數據類型與輸入圖像一致。
kernel—erode()使用某種形狀的窗侵蝕一個圖像,dilate()也使用某種形狀的窗對圖像進行膨脹。參數kernel就表示這個窗。顯然這個窗越大,顯然每次對圖像的腐蝕或膨脹越多,反之亦然。有下面兩種構造這個窗的方法。有下面兩種構造這個窗的方法。
?①使用函數getStructuringElement()來獲取,函數getStructuringElement()的原型如下:
?函數getStructuringElement()的參數意義如下:
?shape—窗的形狀,MORPH_RECT為矩形,矩形中的每一個元素的值為1;MORPH_CROSS代表十字形結構,十字形的長和寬由ksize定,十字形上的元素值也為1;MORPH_ELLIPSE為橢圓,橢圓中的每一個元素的值也為1,橢圓內切于參數ksize定義的矩形大小。可以結合下面這個表更好理解。
?ksize—其意義見對參數shape的講解。
?anchor—當shape為十字形時,這個參數表示十字線的橫線和豎線的交點位置。
?②自定義kernel窗,此種方法的示例可以參見下面這篇博文:
?https://blog.csdn.net/wenhao_ir/article/details/51915869
繼續講函數erode()和函數dilate()的參數意義。
anchor—錨點位置。
iterations—表示迭代次數,即對圖像做幾次腐蝕和膨脹。
borderType—邊界擴展處理方式,詳情見 https://blog.csdn.net/wenhao_ir/article/details/124177989
borderValue—關于這個值,也請參見 https://blog.csdn.net/wenhao_ir/article/details/124177989
下面上使用函數erode()和函數dilate()進行腐蝕和膨脹處理的示例代碼:
代碼中用到的圖像下載鏈接:https://pan.baidu.com/s/1Acoq3mR2RK0KHtYBCtq9qg?pwd=708g
代碼運行結果如下圖所示:
上面的示例代碼是對圖像的腐蝕操作和膨脹操作的直觀認識,接下來,我們再通過Python示例代碼來從數據運算上看一看圖像的腐蝕操作和閉操作是怎么回事。
先來探究膨脹操作:
探究膨脹操作的示例代碼如下:
運行結果如下圖所示:
從以上運行結果可以看出,膨脹操作的運算規則的確是我上面介紹的那樣。為了避免大家來回滾動頁面,我再將運算規則摘錄如下:
圖像的腐蝕和膨脹實際上是用某種形狀的窗去遍歷圖像中的每一個元素,并用這個形狀中的最大值或最小值做為錨點的值(錨點的概念可參考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/124173092)。若取的是最大值,則是膨脹操作,若取的是最小值,則是腐蝕操作。這里某種形狀可以是十字形、菱形、矩形、X形等。這里我補充說明一下,其實所有的窗都是矩形的,那么怎樣定義不同的形狀呢?是這樣操作的:通過把矩形窗中的元素置為1形成不同的形狀。更詳細的說明可見本文對函數getStructuringElement()參數shape的介紹。
函數dilate()的數學運算表達式如下:
dst ( x , y ) = min ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=min(x′,y′):element(x′,y′)?=0?src(x+x′,y+y′)
其中(x’,y’)是窗中的元素坐標。
再來探究腐蝕操作。
探究腐蝕操作的示例代碼如下:
運行結果如下:
從以上運行結果可以看出,腐蝕操作的運算規則的確是我上面介紹的那樣。為了避免大家來回滾動頁面,我再將運算規則摘錄如下:
圖像的腐蝕和膨脹實際上是用某種形狀的窗去遍歷圖像中的每一個元素,并用這個形狀中的最大值或最小值做為錨點的值(錨點的概念可參考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/124173092)。若取的是最大值,則是膨脹操作,若取的是最小值,則是腐蝕操作。這里某種形狀可以是十字形、菱形、矩形、X形等。這里我補充說明一下,其實所有的窗都是矩形的,那么怎樣定義不同的形狀呢?是這樣操作的:通過把矩形窗中的元素置為1形成不同的形狀。更詳細的說明可見本文對函數getStructuringElement()參數shape的介紹。
函數erode()的數學運算表達式如下:
dst ( x , y ) = max ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=max(x′,y′):element(x′,y′)?=0?src(x+x′,y+y′)
其中(x’,y’)是窗中的元素坐標。
知道了腐蝕和膨脹的具體運算過程后,我們便可以知道當參數shape取不同形狀時,效果有什么區別。具體效果有什么不同,大家在理解以上運算過程后,便可以在腦海中想像了,這里博主就不再碼字了。
擴展閱讀:
圖像的形態學開操作(開運算)和閉操作(閉運算)的概念和作用,并用OpenCV的函數morphologyEx()實現對圖像的開閉操作
圖像的形態學梯度運算(基本梯度、外部梯度、內部梯度、X方向梯度、Y方向梯度)的概念、作用以及相關的OpenCV示例代碼
圖像形態學操作之頂帽操作(TopHat)與黑帽操作(BlackHat)
詳解圖像形態學中的擊中擊不中變換操作(HMT),并提醒大家OpenCV4中的擊中擊不中變換操作是有問題的
總結
以上是生活随笔為你收集整理的详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发工具相关总结
- 下一篇: 我是这样来做破解qq,做QQ外挂的 【-