2

我有一個二進制圖像,我想檢測不連續的線並將它們鏈接起來。 我什麼都不知道(座標,角度等)。 任何人都可以引導我如何開始?假設我有這樣的形象:連接不連續的骨架形狀和不連續的線

enter image description here

我想加入不連續的線。並且我想存儲加入的行的信息(在一個數組中)以後使用。

+0

您可以從某種線條檢測算法開始:http://www.ipol.im/pub/art/2012/gjmr-lsd/ 或Matlab的Hough-lines函數。 – GilLevi

回答

1

我發現你的問題很有趣,我會嘗試給你一些想法,但不幸的是不是一個完整的算法(你知道,這需要時間...)。我也會給你留下一些沒有答案的問題。

我認爲您發佈的圖像是二進制圖像,即黑色像素值爲零,白色像素值爲1。我忽略了紅色像素,因爲我認爲您已經繪製了它們以突出顯示您想要連接虛線的位置;忽略紅色像素意味着我將它們的值設置爲零。

首先我們需要一些定義。

非邊界像素具有8鄰居(西北,北,東北,東,東南,南,西南,西)像素:

abc 
h*d 
gfe 
上圖中

該像素由*及其8個鄰居a,b,c,d,e,f,gh指示。

我限定端點像素作爲與一種的值與僅一個鄰居之一值的像素,剩餘鄰居具有零的值,因此,例如此圖顯示的端點像素

000 
011 
000 

因爲d=1和所有其餘的鄰居都是零。 下圖顯示了代替的像素這是不和端點像素,因爲它有兩個鄰居等於一(a=1e=1

100 
010 
001 

現在我們可以開始描述一個簡單的算法的一部分。

在第一步找到所有的端點像素,並把它們放在一個向量中:在下面的圖像中,我標記了從1到15的端點(請注意,端點15在您發佈的圖像中未突出顯示)。

enter image description here

在第二步中,爲每個端點,發現其最接近的端點:例如考慮端點4,其最近的端點5.現在,如果你遵循一個連接端點的簡單規則的最接近的端點,你將有連接4-5,10-11,13-14的段,這些都很好。但考慮1:其最接近的端點是2或可能是3,但我希望算法只是連接2和3,而將1連接到最左邊的垂直線。我也想要6,9和12的相同的行爲。

現在不同的情況:什麼關於6,7和8?忽略8,最接近6的端點是7,但它們已經連接,我們如何管理這種情況?

最後,考慮15:爲什麼沒有在你張貼的圖片中突出顯示它?也許它應該被忽略?

+1

感謝您的回覆,推理您提出的建議很明確,但我認爲他無法處理所有可能存在的案例。所以要回答你的問題案例15它將被忽略,我不知道我們如何能夠處理這個案件1,6,9和12.我認爲你的推理有所改進,我們如何能夠管理所有案件 – Bertrand

0

可能會有所幫助。

  1. 增加線條的厚度,以在-至少2
  2. 查找連續前景像素的那些運行在其上一個或下一個列具有遊程長度之內的所有背景像素的圖像在垂直方向上。這將給出需要處理的點的位置。
  3. 對於每個點找到最近的陡峭點。這將是一個branch point或角度突然發生的一個點。 (先前答案的圖像中的示例點15)。如果沒有這個點,那顯然是另一個end-point。稱這些爲reference point。端點和參考點之間的矢量將給出擴展的方向。
  4. 現在可以有多種方式來決定加入哪個點。你可以沿着這個方向取最近的前景點。您還可以根據KNN分類器中使用的端點和擴展點之間的角度和距離選擇一些特徵。

希望它有幫助。

+0

坦率地說我做不知道我該如何實現這一點,但非常感謝您的回覆 – Bertrand

+0

例程檢測分支點,終點在matlab中可用。刪除分支點後獲取參考點可能會更容易。 – Dib