對於學習圖像處理的人來說,通常都知道形態學算法。之所以要提及形態學算法,是因為雖然很多人都知道這個算法,但是會用或者說能用好的人恐怕不多。
數學形態學方法可以用在二值圖上,也可以對灰度圖像進行處理。對於二值圖像,對應的具體形態學方法包括膨脹、腐蝕、開運算、閉運算、擊中擊不中。對於灰度圖像的形態學方法同樣包括膨脹、腐蝕、開運算和閉運算,一般沒有擊中擊不中,此外,還包括形態學梯度、頂帽和底帽運算方法。
盡管有這麼多運算方法,但是最基本的形態學方法隻有膨脹和腐蝕兩種,其它的方法都是基於這兩種進行各種組合運算得到的。形態學方法可以實現圖像的孔洞填充、斷裂區域連通、圖像增強、連通區域分割、過濾雜點、邊界提取、形態濾波、細化、骨架抽取等功能。不管是在傳統的圖像處理方法中,還是深度學習算法中,形態學方法都是極其重要的處理方法。幾乎在所有視覺圖像處理中,都可以看到形態學處理的應用。
說起形態學運算的原理,其實非常簡單,主要就是基於集合的處理方法,形態學運算就是圖像與結構元素之間的某種運算。以二值圖像的膨脹為例,數字圖像之間的運算其實就是一堆數字在運算,二值圖像的像素值隻有“0”和“1”兩種。結構元素也可以看成是一幅圖像,比如3×3大小的矩形結構元素,可以認為是3×3大小的一幅圖像,像素值全是“1”。兩者之間的運算如圖1所示。
![](https://news.xinpengboligang.com/upload/keji/5b4c9e1f2160ecbb562ee3db10021b07.jpeg)
圖1 膨脹運算示意
仔細看圖1,尤其是用紅色圓圈圈起來的位置,就明白膨脹運算的原理了,錨點默認是結構元素的中心,也可以自己定義錨點位置,結構元素與原圖進行交集運算,如果交集不為空,則原圖對應的錨點位置的值為“1”,結構元素在原圖上依次滑動,與原圖上對應位置求交集,則得到膨脹運算結果。
當然,其實懂得算法的原理也沒什麼用,因為絕大部分人也不可能去修改這個算法,會用就行,對於其它形態學算法也是類似的道理,實際使用時,也是通過不管調整結構元素的大小和形狀來得到想要的結果。
關於形態學的具體應用其實在之前的很多示例中都已經演示過了,這裡再演示一下,以圖2為例,要統計圖像中瓶子的數量,當然隻需要把瓶口部分的白色區域數量統計出來就可以了。這幅圖像中,放瓶子的籃子邊框會幹擾二值化處理結果,因此,可以先采用形態學方法直接對灰度圖進行處理,然後再進行二值化,最後通過提取輪廓並且過濾掉幹擾的輪廓就可以檢測出來。具體的處理步驟可以看圖2所示。
![](https://news.xinpengboligang.com/upload/keji/cdf7b18ff9255f9372a9a31708e63493.jpeg)
(a)原圖
![](https://news.xinpengboligang.com/upload/keji/9990d601357e30a1fa8850f25b52e70d.jpeg)
(b)頂帽運算
![](https://news.xinpengboligang.com/upload/keji/06240958858cb41e054c72fcdf6ec1b5.jpeg)
(c二值化)
![](https://news.xinpengboligang.com/upload/keji/f2baec83e1727a3dfca6eb4d59223ba4.jpeg)
(d)查找輪廓
![](https://news.xinpengboligang.com/upload/keji/6ff6fc69b2acf559d3aa6f038476f62d.jpeg)
(e)按長度過濾輪廓
![](https://news.xinpengboligang.com/upload/keji/7cff817234faabdd3c28f23e8066244a.jpeg)
(f)按面積過濾輪廓
圖2 統計瓶子數量
可以看出,隻需要簡單幾步,就可以得到結果。在使用這些算法的時候,其實我自己也已經忘了某些算法的原理,但是不影響使用,之所以要反復提及這個問題,是因為到目前為止,還有很多人糾結於opencv應該怎麼學,是要把每個算法原理弄清楚嗎?對於應用而言,能熟練掌握這些算法的使用方法就已經足夠了。
形態學的應用還有很多。比如下面的圖3是opencv提供的示例圖像,可以通過形態學提取圖像中的直線和音樂符號。其實就簡單的膨脹腐蝕就可以實現。在使用這些形態學方法的時候,最重要的就是結構元素的形狀和大小。常用的形狀包括矩形、橢圓和十字形,更高級的應用是要學會自定義結構元素的形狀,從而得到想要的結果。在定義結構元素的大小方面,需要放心大膽的去嘗試各種值。此外,很多時候形態學方法需要反復使用,不要指望一到兩次就能夠得到想要的結果。
圖3 opencv的示例圖像
下面再給一張圖像,測量圖中區域的外接圓大小。這是一個網友發給我的圖像,雖然幹擾比較多,但是處理起來還是很方便的,其中也用到了形態學算法。
![](https://news.xinpengboligang.com/upload/keji/981bbabc158decceb79a0a663cf38dd6.jpeg)
(a)原圖
![](https://news.xinpengboligang.com/upload/keji/02a1b961199b41f3452d3880ba533aec.jpeg)
(b)結果
圖4 計算圖中外接圓大小
OpenCV雖然函數眾多,但是,隻要勤加練習,還是可以熟練掌握這些函數。對於視覺應用而言,需要掌握的常用函數已經在置頂的那篇文章中指出來了,有需要的可以去看一看。如何快速掌握這些函數?方法、平臺和文檔都已經做好了,剩下的就要靠自己了。建議對照示例文檔和學習平臺進行練習一周,然後拋開文檔,用提供的示例圖像自己做出結果來,基本上就可以處理大部分視覺問題。
這段時間都很忙,已經好久沒更新了,今天也是想到哪就寫到哪,可能有點亂,就這樣吧,後續有時間再做一些示例給大傢展示OpenCV在視覺處理中的應用。學習平臺和練習文檔放在下面鏈接了: