2010-11-11 52 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