我正在尝试实现一张纸,但我陷入了一个称为高程过滤器的部分!这是本文的那部分:
有谁知道如何在 MATLAB 中编写它?
您要问的内容与图像处理中称为分水岭变换(或维基百科)的内容密切相关。
根据分水岭方法,灰度图像被视为地形浮雕并且充满水。这样做,图像的不同区域可以分开,根据不同盆地一旦充满水后的连接方式。
如果分水岭是您的最终目标,那么图像处理工具箱有一个实现。在这里。
原则上,在您的问题中,给定一个局部最小值q
,height(p)
,对于p
接近q
,解决了最小化问题
height(p) = inf_{g} \int_g ||grad I (g) || dg
g
连接的曲线在哪里p
,q
并且I
是您的图像。
有关更多数学细节,您可以考虑,例如,这篇论文。
例如,对于实现细节,matlab 应该有 mex 代码。
您可以使用图像处理工具箱功能watershed
来计算您的海拔。我将从一个简单的示例 300×300 矩阵开始来表示您的身高数据,如下图的第一行所示:
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;