2015-11-17 75 views
2

我有黑白圖像,包括輪廓內未填充的輪廓。這些輪廓代表了實體的邊緣。我想檢測固體(島)和洞,而不是用Matlab填充固體。在Matlab中檢測孔和實心圖像,包括Matlab中的輪廓

我嘗試了一些方法。我可以檢測到固體和孔洞。但是如果它們位於另一個固體/孔內,我無法檢測出固體和孔洞。

F.e:最後我嘗試在以下鏈接荷銀的回答中提到的方法: Fill area between two connected components in MATLAB

但它無法檢測孔內部的固島嶼。

另外:所有我能找到的例子都能很好地檢測背景中的固體並檢測這些固體中的孔。或者有背景的多個對象(固體)或多於一個孔狀中提到的鏈接的對象: Distinguish a simply connected figures?

但我想上具有分層順序填充輪廓工作。

一個例子形象:

enter image description here

我想要的輸出是:

enter image description here

編輯我的問題,將我以前的作品,以澄清

我只想做的就是檢測whi我必須填寫圖像的ch區域作爲實體。 圖像有很多輪廓。這些輪廓是實體和孔的邊緣。與許多其他示例不同,我的圖像具有輪廓內的輪廓...

假設背景上有一個輪廓。這意味着它是一個堅實的,我們應該填補它。但是如果第一個輪廓內有第二個輪廓,這意味着它是一個洞,它必須保持不填充。如果第二個裏面有第三個,那又是一個堅實的,它必須填補。這就像那樣...

到目前爲止,我已經嘗試了一種類似於@Huádéní華得尼的方法(他的代碼比我的簡單,更好,所以我不寫我的話在他的代碼上)。

在這種方法中,我使用光柵掃描來掃描像素。每次找到一個輪廓像素我改變狀態0和1之間。如果狀態是0我用0填充像素,如果它是1我填充它們1.

但是這種方法存在問題。在每個區域的上部和下部水平邊緣留有一些虛線。

這是我的輸出圖像使用相同的方法。它幾乎與@Huádéní華得尼相同。

enter image description here

+0

@rayryeng,在鏈接你提到的例子更多的是找到固體或固體及其連接類型。但我甚至無法檢測到洞內是否還有其他固體,或者是更多層次更多...... – furkan

+2

我明白了。那好吧,你並沒有真正清楚自己。我會重新開放。這也有助於向我們展示您嘗試過的內容,而不是向我們展示您所閱讀的內容。此外,你想填寫什麼,你不想填寫什麼是模糊的。我仍然不明白如何從原始圖像到填充的圖像。如果我遇到了麻煩,那麼任何自動算法都很可能會遇到麻煩。 – rayryeng

+1

@rayryeng <<如果我遇到了麻煩,那麼任何自動算法都可能會有麻煩。>>,這是大多數人不理解的。 –

回答

0

什麼樣的每一行遍歷一個簡單的解決方案。請參閱以下代碼。這並不完美,需要處理持續的白線。我會更新,如果我能解決它。

clc; clear all; 

img = imread('g4K3N.png'); 
imgb = im2bw(img); 
imgb2 = imgb; 

for r = 1:size(img,1) 
    cc = 0; 
    p = 0; 

    for c = 2:size(img,2) 
     if (imgb(r,c)==imgb(r,c-1)) 
       imgb2(r,c) = p; 
       continue; 
     else 
      cc = cc+1; 
      if (cc~=0 && mod(cc,2)==0) 
       p = ~p; 
       imgb2(r,c) = p; 
      end 
     end 
    end 
end 

imshow(imgb2); 

輸出:

enter image description here

+0

謝謝你的回答。我已經做了類似你的事情。但我有像你的照片那樣的虛線。我編輯了我的問題的細節。 – furkan

+0

那麼嘗試一些圖像處理技術來去除線條,如侵蝕和擴張。是的,正如@rayryeng之前所說的,這似乎很難實現。 –