形態學方法在視覺圖像處理中的應用

2024年2月6日 22点热度 0人点赞

對於學習圖像處理的人來說,通常都知道形態學算法。之所以要提及形態學算法,是因為雖然很多人都知道這個算法,但是會用或者說能用好的人恐怕不多。

數學形態學方法可以用在二值圖上,也可以對灰度圖像進行處理。對於二值圖像,對應的具體形態學方法包括膨脹、腐蝕、開運算、閉運算、擊中擊不中。對於灰度圖像的形態學方法同樣包括膨脹、腐蝕、開運算和閉運算,一般沒有擊中擊不中,此外,還包括形態學梯度、頂帽和底帽運算方法。

盡管有這麼多運算方法,但是最基本的形態學方法隻有膨脹和腐蝕兩種,其它的方法都是基於這兩種進行各種組合運算得到的。形態學方法可以實現圖像的孔洞填充、斷裂區域連通、圖像增強、連通區域分割、過濾雜點、邊界提取、形態濾波、細化、骨架抽取等功能。不管是在傳統的圖像處理方法中,還是深度學習算法中,形態學方法都是極其重要的處理方法。幾乎在所有視覺圖像處理中,都可以看到形態學處理的應用。

說起形態學運算的原理,其實非常簡單,主要就是基於集合的處理方法,形態學運算就是圖像與結構元素之間的某種運算。以二值圖像的膨脹為例,數字圖像之間的運算其實就是一堆數字在運算,二值圖像的像素值隻有“0”和“1”兩種。結構元素也可以看成是一幅圖像,比如3×3大小的矩形結構元素,可以認為是3×3大小的一幅圖像,像素值全是“1”。兩者之間的運算如圖1所示。

圖1 膨脹運算示意

仔細看圖1,尤其是用紅色圓圈圈起來的位置,就明白膨脹運算的原理了,錨點默認是結構元素的中心,也可以自己定義錨點位置,結構元素與原圖進行交集運算,如果交集不為空,則原圖對應的錨點位置的值為“1”,結構元素在原圖上依次滑動,與原圖上對應位置求交集,則得到膨脹運算結果。

當然,其實懂得算法的原理也沒什麼用,因為絕大部分人也不可能去修改這個算法,會用就行,對於其它形態學算法也是類似的道理,實際使用時,也是通過不管調整結構元素的大小和形狀來得到想要的結果。

關於形態學的具體應用其實在之前的很多示例中都已經演示過了,這裡再演示一下,以圖2為例,要統計圖像中瓶子的數量,當然隻需要把瓶口部分的白色區域數量統計出來就可以了。這幅圖像中,放瓶子的籃子邊框會幹擾二值化處理結果,因此,可以先采用形態學方法直接對灰度圖進行處理,然後再進行二值化,最後通過提取輪廓並且過濾掉幹擾的輪廓就可以檢測出來。具體的處理步驟可以看圖2所示。

(a)原圖

(b)頂帽運算

(c二值化)

(d)查找輪廓

(e)按長度過濾輪廓

(f)按面積過濾輪廓

圖2 統計瓶子數量

可以看出,隻需要簡單幾步,就可以得到結果。在使用這些算法的時候,其實我自己也已經忘了某些算法的原理,但是不影響使用,之所以要反復提及這個問題,是因為到目前為止,還有很多人糾結於opencv應該怎麼學,是要把每個算法原理弄清楚嗎?對於應用而言,能熟練掌握這些算法的使用方法就已經足夠了。

形態學的應用還有很多。比如下面的圖3是opencv提供的示例圖像,可以通過形態學提取圖像中的直線和音樂符號。其實就簡單的膨脹腐蝕就可以實現。在使用這些形態學方法的時候,最重要的就是結構元素的形狀和大小。常用的形狀包括矩形、橢圓和十字形,更高級的應用是要學會自定義結構元素的形狀,從而得到想要的結果。在定義結構元素的大小方面,需要放心大膽的去嘗試各種值。此外,很多時候形態學方法需要反復使用,不要指望一到兩次就能夠得到想要的結果。

圖3 opencv的示例圖像

下面再給一張圖像,測量圖中區域的外接圓大小。這是一個網友發給我的圖像,雖然幹擾比較多,但是處理起來還是很方便的,其中也用到了形態學算法。

(a)原圖

(b)結果

圖4 計算圖中外接圓大小

OpenCV雖然函數眾多,但是,隻要勤加練習,還是可以熟練掌握這些函數。對於視覺應用而言,需要掌握的常用函數已經在置頂的那篇文章中指出來了,有需要的可以去看一看。如何快速掌握這些函數?方法、平臺和文檔都已經做好了,剩下的就要靠自己了。建議對照示例文檔和學習平臺進行練習一周,然後拋開文檔,用提供的示例圖像自己做出結果來,基本上就可以處理大部分視覺問題。

這段時間都很忙,已經好久沒更新了,今天也是想到哪就寫到哪,可能有點亂,就這樣吧,後續有時間再做一些示例給大傢展示OpenCV在視覺處理中的應用。學習平臺和練習文檔放在下面鏈接了:

商品詳情

��Ʒ����