在3D图像上跟随脊线的算法

3
我正在尝试寻找一种算法(或算法思路),用于跟随数字高程模型(DEM)生成的3D图像上的山脊。我已经成功地编写了一个非常基本的程序,它只是在图像的每一行上迭代,并在发现方位角有大幅度变化(即从小于180度到大于180度)的地方标记山脊线。
然而,这个程序产生的线条并不完美,经常会出现间隙和各种奇怪的伪影。我希望通过使用某种算法来跟随山脊线,从而生成完整的线条(也就是没有间隙)和更加准确的线条。
许多人向我提到了蛇形算法,但它们似乎并不是我要寻找的东西。我也做了很多关于路径规划算法的搜索,但同样不是我要找的正确方法。
有没有人对我应该查看哪些类型或算法或具体算法有任何建议?
更新:我被要求增加一些关于我将应用此算法的确切领域的细节。它是用于沙丘的网格化高程数据。我正在尝试提取这些沙丘的山脊,它们看起来类似于排水分区之间的边界,但可能更加复杂(例如,可能会有多个非常靠近彼此的沙丘,其山脊逐渐合并)。

你对你的需求或应用程序并没有非常清晰的说明。如果是排水盆定义与“具有挑战性的徒步旅行路线”的区别,那么你的需求将会不同。你对于山脊的定义是什么?(这取决于你的应用程序。)根据你对于山脊的定义,我们可以开始确定适当的算法。 - John
谢谢。我已经编辑了问题并加入了更多细节。 - robintw
下面Nav的回答基本上是正确的。您可以通过提取曲面的曲率然后查看最大曲率来轻松找到脊线。这里有一个例子代码http://www.mathworks.com/matlabcentral/fileexchange/11168-surface-curvature. - twerdster
4个回答

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提供了一个模块,可以在大多数格式上进行法向量和曲率估计。在编写代码之前,您可以使用它来测试这个想法。


曲率 k=1/r,因此在平坦区域曲率将接近于0。 - twerdster

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
您可以将高程视为灰度颜色,然后使用二维边缘识别滤镜。现有许多边缘识别方法可供选择,具体选择取决于您的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接