2016-06-08 133 views
2

我得到一個圖像,也是圖像中區域的邊界。例如,我有一個具有邏輯類型的遮罩,邊界值爲1,而對於其他像素,值爲0.我想標記由邊界分割的區域,而我不知道如何分割和標記基於連續邊界的區域。做圖像分割給定圖像中區域的邊界

邊界看起來是這樣的:

0 0 0 1 0 0 0 1 0 0 
0 0 1 0 0 0 0 1 0 0 
1 1 0 1 0 0 0 1 0 0 
0 0 0 0 1 0 1 0 0 0 

有了上面的圖,將有會被識別四個區域。

回答

4

從圖像處理工具箱功能bwlabel是應該使用標記的非零像素的每一連續區域中的二元掩模理想的功能。但是,您希望對由「邊界」像素設置爲1的像素描繪的像素執行此操作。因此,只需使用二進制掩碼的反色,以便在零像素上進行操作,而不是非零像素。同樣從您的定義中,區域使用4像素連接來分隔。 bwlabel在搜索連續區域時默認使用8像素連接,這意味着它在N,NE,E,SE,S,SW,W和NW方向上查找。你要手動指定4像素連接,這看起來只是假設你的面具被存儲在變量L的N,E,S和W

的方向,簡單地做:

labels = bwlabel(~L, 4); 

輸出labels將是一個地圖,告訴你每個像素的成員資格。相同成員資格的區域會告訴您這些像素屬於同一組。使用

你的榜樣,我們得到:

>> L = [0 0 0 1 0 0 0 1 0 0 
     0 0 1 0 0 0 0 1 0 0 
     1 1 0 1 0 0 0 1 0 0 
     0 0 0 0 1 0 1 0 0 0]; 
>> labels = bwlabel(~L, 4) 

labels = 

    1  1  1  0  3  3  3  0  4  4 
    1  1  0  3  3  3  3  0  4  4 
    0  0  2  0  3  3  3  0  4  4 
    2  2  2  2  0  3  0  4  4  4 

零的每個島都有一個唯一的ID,其中屬於同一個ID像素屬於同一個島嶼或地區。如果你不想使用bwlabel並從最初的原則來做這件事,你可以參考我以前的帖子,使用深度優先搜索找到連接組件的區域:How to find all connected components in a binary image in Matlab?。請注意,這不是有效的代碼,因此您只能將其用於教育和研究目的。建議使用bwlabel,因爲它是一種快速功能並經過良好測試。您還必須修改代碼,以便它不搜索8像素連接,並且應該只查看4像素連接。確保在使用代碼之前也反轉輸入。

+0

感謝您的回答!雖然,我的問題是標記連接的組件的值爲0,而不是1.因此,在這個例子中,應該有4個區域的標籤。我想我可以通過遞歸來解決這個問題,但不知道它是怎麼樣的。你有什麼主意嗎? – user3919259

+0

然後只對圖像的反方向執行相同的過程。所以用'〜L'調用函數。您還需要指定4個像素連接。這樣,值爲0的值就成爲感興趣的像素,而值爲1的值將分開那些非零像素。這是你在找什麼?如果是這種情況,我很樂意編輯我的答案。事實上,我認爲這是你判斷你有4個地區的正確答案。 – rayryeng

+0

@ user3919259我根據您的意見編輯了我的帖子。我相信這是你想要的。祝你好運。 – rayryeng