區域生長是一種串行區域分割的圖像分割方法。區域生長是指從某個像素出發,按照一定的準則,逐步加入鄰近像素,當滿足一定的條件時,區域生長終止。區域生長的好壞決定于1.初始點(種子點)的選取。2.生長準則。3.終止條件。區域生長是從某個或者某些像素點出發,最后得到整個區域,進而實現目標的提取。
區域生長的原理
區域生長的基本思想是將具有相似性質的像素集合起來構成區域。具體先對每個需要分割的區域找一個種子像素作為生長起點,然后將種子像素和周圍鄰域中與種子像素有相同或相似性質的像素(根據某種事先確定的生長或相似準則來判定)合并到種子像素所在的區域中。將這些新像素當作新的種子繼續上面的過程,直到沒有滿足條件的像素可被包括進來。這樣一個區域就生長成了。
區域生長實現的步驟如下:
1. 對圖像順序掃描!找到第1個還沒有歸屬的像素, 設該像素為(x0, y0);
2. 以(x0, y0)為中心, 考慮(x0, y0)的4鄰域像素(x, y)如果(x0, y0)滿足生長準則, 將(x, y)與(x0, y0)合并(在同一區域內), 同時將(x, y)壓入堆棧;
3. 從堆棧中取出一個像素, 把它當作(x0, y0)返回到步驟2;
4. 當堆棧為空時!返回到步驟1;
5. 重復步驟1 - 4直到圖像中的每個點都有歸屬時。生長結束。
這個過程中有幾個關鍵的問題:
a》 給定種子點(種子點如何選取?)
種子點的選取很多時候都采用人工交互的方法實現,也有用其他方式的,比如尋找物體并提取物體內部點作為種子點。
b》 確定在生長過程中能將相鄰像素包括進來的準則
灰度圖像的差值;彩色圖像的顏色等等。都是關于像素與像素間的關系描述。
c》 生長的停止條件
Python實現
灰度差值的區域生長算法實現
算法實現的步驟:
a》 創建一個空白的圖像(全黑);
b》 將種子點存入vector中,vector中存儲待生長的種子點;
c》 依次彈出種子點并判斷種子點如周圍8領域的關系(生長規則),相似的點則作為下次生長的種子點;
d》 vector中不存在種子點后就停止生長。
貼圖看看使用該算法的圖像處理效果:
首先對原圖像進行二值化:
得到種子點的方法這里就不用介紹了,這個不是該算法的重點。得到兩個種子點(左右肺),分別使用區域生長算法得到左右肺區,然后與原圖進行與運算,得到結果:
分水嶺算法原理
灰度圖像可以被看成拓撲平面,灰度值高的區域可以看出山峰,灰度值低的區域可以看成是山谷。向每一個山谷當中灌不同顏色的水。水位升高,不同山谷的水會匯合,為防止不同山谷的水匯合,小在匯合處建立起堤壩。然后繼續灌水,然后再建立堤壩,直到山峰都掩模。構建好的堤壩就是圖像的分割。
此方法通常會得到過渡分割的結果,因為圖像中的噪聲以及其他因素。為了減少此影響,opencv使用基于標記的分水嶺算法,此算法要設置哪些山谷中的匯合點,哪些不是。這是一種交互式的圖像分割算法那。我們要給已知對象打上不同表情。如果某個區域肯定是前景或對象,就使用某個顏色或灰度值標簽標記它。如果是背景那么使用其他顏色進行標記,其余不能確定的部分用0標記。然后使用分水嶺算法,每次灌水,標簽會被更新,當兩個不同顏色的標簽相遇就會構建堤壩,知道所有山峰掩模,最后得到的邊界對象值是-1。
python 代碼:
對挨在一起的對象進行分割。
要出去圖像中的白噪聲。可以使用形態學運算,使用閉運算去除對象中的空洞。
靠近對象中心的區域是前景,離對象遠的區域是背景,不確定的區域是邊界。
首先提取硬幣區域,使用腐蝕操作去掉邊緣,剩下的就是硬幣。但硬幣沒有接觸時,此方法有效,但是由于硬幣相互接觸,就要使用另外一種有效的方法:距離變換加上合適的閾值。
之后,要尋找不確定是否是硬幣的區域。這里需要膨脹操作。膨脹操作會將對象邊界延伸到背景當中。由于邊界區域被去除,現在就能知道哪些區域是前景,哪些是背景。
余下的區域不知道如何區分,那么使用分水嶺算法。這些區域通常是前景與背景的交界處。從能否確認是否是背景的區域中減去確定是前景的區域就得到了邊界。
(前景和背景)
使用作者的代碼后生產的結果,提取到了前景,為了演示一下不確定的區域,調了一下計算前景的距離變換的參數,使得中間出現不確定的區域)
這里面使用個cv2.distanceTransform函數
該函數用于計算2值圖象中所有像素離其最近的值為0像素的近似距離。
參數為
完整代碼
現在知道了那些背景是硬幣,可以創建標簽。(與原圖像大小相同,數據類型為int32的數組)。
對于已經確定分類的區域,也就是背景和前景,使用整數標記,不確定的區域是用0標記。可以使用cv2.connectedComponents()函數來實現此功能。它會將背景標記為0,其他標記為位從1開始的正整數。
但是,如果背景標記為0,那么分水嶺算法會將其當成位置區域,所以使用不同的整數進行標記,對于不確定的區域,函數標記為0.
結果使用JET顏色地圖表示。深藍色未知區域,硬幣區域使用不同顏色。其余部分用淺藍色。
使用分水嶺算法
效果不錯
編輯:jq
-
圖像處理
+關注
關注
27文章
1289瀏覽量
56723 -
圖像分割
+關注
關注
4文章
182瀏覽量
17995 -
python
+關注
關注
56文章
4792瀏覽量
84628
原文標題:CV基礎:區域生長與分水嶺算法
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論