MATLAB实现的Elevation算法

时间:2013-05-25 13:17:41

标签: algorithm matlab

我正在尝试实现一张纸,但我被困在一个名为高程过滤器的部分! 这是本文的一部分:

Elevation algorithm

有谁知道如何在MATLAB中编写它?

2 个答案:

答案 0 :(得分:1)

您所询问的内容与图像处理中的内容watershed transform(或wikipedia)密切相关。

根据分水岭方法,灰度图像被视为地形浮雕,并且充满了水。这样,图像的不同区域可以根据不同盆地加入水中的方式分开。

如果分水岭是您的最终目标,图像处理工具箱就有了它的实现。 Here


原则上,在您的问题中,给定q height(p)的本地最小值,p接近q,可以解决最小化问题

     height(p) = inf_{g} \int_g ||grad I (g) || dg

其中g是加入pq的曲线,I是你的形象。

有关更多数学详细信息,您可以考虑使用this paper

对于实现细节,例如,matlab应该有mex代码。

答案 1 :(得分:0)

您可以使用Image Processing Toolbox函数watershed来计算提升。我将从一个简单的示例300-by-300矩阵开始,以表示您的 height 数据,如下图第一行所示:

height = repmat(uint8([1:100 99:-1:50 51:1:150 149:-1:100]), 300, 1);

在这种情况下,每一行都具有相同的配置文件。我们可以使用watershed计算矩阵:

basin = watershed(height)+1;

这显示在下图的第二行。请注意,有些峰值的默认值为1,因为它们位于盆地的边缘上。你必须自己决定如何处理这些问题,因为在这里我最终将所有的边缘集中在一个伪盆中。

接下来,我们可以使用accumarray来计算最小值矩阵(如下图第三行所示),该矩阵将每个盆地的最小值映射到其中的所有点盆:

minValues = accumarray(basin(:), height(:), [], @min);
minima = minValues(basin);

最后,提升可以这样计算(结果显示在下图的最后一行):

elevation = height - minima;

图:

enter image description here