2011-09-20 85 views
10

比方說,我有一些位圖數據(黑色),在這些位圖數據上已經有一些線條以矢量格式(綠色)繪製。這些線大致遵循位圖數據的形狀。在一些地方,線條相交。如何在兩條線的交點旁找到4點

所以我想要做的是,知道綠線交點的位置,我如何找到A,B,C和D的位置?

請參見下面的一些例子:

enter image description here

我不知道如何給定線的隨機定位解決這個問題並且有時他們甚至沒有內部的黑色形狀。但是,我想必須有某種方法。任何建議?

+0

你能更加精確:綠色線交叉點應該在**裏面嗎?A,B,C,D還是A,B,C,D如圖所示? – 2011-09-20 05:28:29

+0

使用位圖執行此操作可能變得困難/緩慢。你不能把輸入作爲矢量圖形嗎? –

+1

我沒有看到綠線如何幫助;在圖片2中,它們相交於B&C –

回答

3

最簡單的方法我能想到的是這樣的:

  1. 過濾圖像刪除綠線。一個簡單的方法是使用某種稀疏來填充相鄰像素的背景顏色。

  2. 現在你應該有一個只包含黑色(寬)線和白色背景的圖像。

  3. 使用角點檢測算法再次過濾圖像,例如Harris detector。這會給你四個角落。

注:

  1. 根據輸入數據時,你可能會超過四個角落。在任何情況下,驗證您提取的四個角都確實是交叉點的可能角落是個好主意。

  2. 同樣,這是一個非常粗糙的方法,但是如果輸入數據和示例圖片一樣乾淨,並且綠線和黑線之間的距離不是太大,我認爲它可能工作。

0

首先,讓我說我對這個問題一無所知,也沒有任何經驗。所以這只是我的猜測。但我會開始忽視綠線 - 這,順便說一句,也不像

順便說一句,這有沒有做任何道路?

所以,走綠線。在此之後,像上述四種方法中的任何一種一樣,選取一個小方塊,直到完成所有這些方塊,然後查找具有最大像素黑/白比例的方塊。那些應該是那些有「十字路口」的人。通過映射那些與白色像素接壤的黑色像素,您應該擁有道路/場地邊界。之後,確定這些點應該很容易。

就像我說的,瘋狂的猜測。有趣的問題 - 想知道這些知識豐富的隊伍會出現什麼。

0

首先,您必須從原始圖像中提取邊緣以獲取描述黑白邊框的多邊形。

然後,您遍歷這些邊的點並計算到兩條綠線的交點的逐點距離。四個最小的距離來自你正在尋找的點。

這是回答您的問題嗎?還是我誤解了一些東西?

如果您只想要4個角落,則不需要綠線:只需從邊緣提取中取出邊界,然後使用Savitzky-Golay濾波器進行平滑處理,然後計算逐點曲率。 剛剛提取曲率最大的點。

0

您需要矢量化二值圖像。我們的大學項目是正確的主題 - Corners Toolbox Allowing Processing Binary Images in a Compressed Form(不要被名稱混淆 - 「壓縮」在這裏意味着二進制圖像首先轉換爲所謂的角落鏈表)。

1)將圖像轉換爲角點(參見上述鏈接的第4章)。然後,您可以使用角點的線插值(第5.5章) - 您可以修改我們的算法,以查看更大線條中的大斜率變化(〜90度)。

2)你不需要綠線。您可以使用骨架化算法來查找黑色部分的骨架(請參閱第5.4章),並用線條插入此骨架(請參閱上述鏈接的第5.5章)。

如果您對這個項目感興趣,我可以問同事我們是否可以提供源代碼。

0

最簡單的方法是鏤空。首先分開綠色和黑色/白色圖像。在兩幅圖像上運行一個骨架算法(在OpenCV中也是一個非常簡單的形態學操作),並確定交點(可以在骨架圖像中使用一個簡單的8鄰域像素計數來完成:也就是說,對於每個黑像素計數多少像素連接水平,垂直或對角線,如果這個值> = 4,它是一個交叉點)。現在爲這些鏤空點做一個最近鄰居匹配,然後就完成了。

2

我假設你知道如何獲得(綠色)矢量線相交的座標(x,y),所以我將省略那部分。

從最接近(x,y)的像素開始,逐個像素地以方形螺旋(或您喜歡的其他搜索模式)向外行進。在每個步驟中,檢查您是否在僅有一個白色Moore neighbour的黑色像素上。如果是這樣,那麼黑色像素和它的白色鄰居觸摸(可能是一個共同的角落)的地方是你的一個點(稱之爲A)。繼續前進,直到找到三個(B,C,D)。這些將是最接近綠色交叉點的四個這樣的點 - 在您的問題中顯示的四個示例中,它們可以正常工作。

但是,如果綠色交叉點是兩個黑色交叉點之間的中間點,則該算法將失敗;在這種情況下,它將混合來自兩個黑色交叉點的點。如果你擔心這一點,那麼只要你找到了A點,這次重新啓動你的行進螺旋,以A爲中心,並且進行到你找到B,C,D爲止。這實際上是「捕捉「到最近的黑色交叉點。

您可以添加更多的巧妙,以避免搜索同一地區兩次;重新啓動或重新集中你的搜索模式,一旦你找到了B,並且一旦你找到了C,等等......取決於你想要/需要的想法。

0

您應該能夠找到綠線交叉的點以及黑線通過侵蝕(縮小到點)過程交叉的中點。然後使用最接近的一對點算法來查找哪條黑線與綠線交叉點最接近。

然後,您可以從黑線相交處開始搜索。您需要一個優先級隊列,根據距離最近的黑線交叉點的距離處理點。將四個相鄰點放在隊列中的黑線交點處。對於隊列中的每個點,您需要檢查它是否是白色像素(我們需要那些),檢查它之前沒有被訪問過(在這種情況下跳過),然後將其四個相鄰像素添加到隊列。前四個白色像素應該是你想要的那個(假設你有一個很好的找到交點的鏤空/縮小方法),但是你應該真正採用白色像素,直到找到前四個不相鄰的像素。