2010-11-11 48 views
3

我正試圖從3D數字高程模型(DEM)導出的3D圖像上尋找一個跟隨脊的算法(或算法思路)。我已經設法獲得非常基本的程序工作,它只是遍歷圖像的每一行,標記一條脊線,無論它在哪方面發現很大的變化(即從180度到180度都從<)。在3D圖像上跟蹤脊的路徑的算法

但是,這種產生的線條並不精彩,經常會有間隙和各種奇怪的人工製品。我希望通過使用某種算法來追蹤脊線來嘗試並擴展它,從而生成完整的線(即沒有間隙)並且更精確。

許多人都提到蛇算法,但他們似乎並不完全符合我的要求。我還做了很多關於路徑尋找算法的搜索,但是它們似乎並不是很正確。

有沒有人有任何建議的類型或算法或特定的算法,我應該看看?

更新:我被要求添加一些更詳細的信息,我將會應用到這個確切的區域。它正在處理沙丘網格高程數據。如果這些沙丘看起來類似於流域盆地之間的界限,但我可能會更加複雜(例如,可能有多個沙丘彼此非常接近並且逐漸合併成波峯),我試圖提取波峯

+0

您對於您的要求或您的應用程序的要求並不十分清楚。如果將排水盆定義爲「挑戰徒步旅行路線」,您的需求將會不同。 你對脊的定義是什麼? (這是由您的應用程序驅動的。) 根據您對嶺的定義,我們可以開始識別適當的算法。 – John 2010-11-11 17:54:30

+0

謝謝。我編輯了這個問題來詳細說明一下。 – robintw 2010-11-11 18:32:07

+0

Nav的回覆大部分都是正確的。通過提取曲面的曲率,然後查看最大麴率,可以輕鬆找到脊。下面是一個示例代碼http://www.mathworks.com/matlabcentral/fileexchange/11168-surface-curvature。 – twerdster 2011-01-10 16:54:40

回答

1

我不知道你的數據是怎樣的,或者你需要多少自動化。如果如果由沒有明確的脊峯這是不行的(但你可能就不會問這個問題。)

startPoint = highest point in DEM (or on ridge) 
curPoint = startPoint; 
line += curPoint; 
Loop 
    curPoint = highest point adjacent to curPoint not in line; // (Don't backtrack) 
    line += point; 
Repeat 

好奇真正的解決方案變成什麼出來的人。

編輯添加:根據數據集的粗糙程度,「點」可以是點的局部區域的單點或平滑平均值。

1

你可以把高程,你會灰度顏色,然後使用2D邊緣識別過濾器。有很多邊緣識別方法可用。最好的將取決於你的具體需求。

2

使用曲率的符號變化可以很好地估計山脊。請注意,平坦區域的曲率將接近無窮大。用於脊檢測算法因此可能僞碼可以是:

for each face in the mesh 
    compute 1/curvature 
    if abs(1/curvature) != zeroTolerance 
    flag face as ridge 
    else 
    continue 

(zeroTolerance是一個數字接近但不等於零例如0.003等)

另外Meshlab提供用於正常&曲率估計的模塊上大多數格式。在對代碼進行編碼之前,您可以使用它來測試這個想法。

+0

曲率k = 1/r因此在平坦區域曲率將接近0 – twerdster 2011-01-10 16:50:24