1

我有一个地形数据矩阵,它很大。我已经用 NaN 替换了陆地数据,并且海深数据是正的。(可以在下面看到一个小样本)

b= [
NaN NaN NaN NaN
4   NaN NaN NaN
19  14  NaN NaN
21  18  14  NaN
24  17  NaN NaN
40  13  NaN NaN
154 26  NaN NaN
232 44  NaN NaN
500 200 100 NaN
200 100 200 NaN
NaN NaN NaN NaN
];

我想获得沿海细胞。它应该是: (1,1) (2,2) (3,3) (4,4) (5,3) (6,3) (7,3) (8,3) (9,4) (10,4) (11,3) (11,2) (11,1) 这样我们就可以将单线轮廓绘制为海岸线。

我读了这篇文章MATLAB,在每一步都发生变化的矩阵中跟踪边界的最佳方法是什么? 但我无法使用它获得想要的海岸线。我也写了一个如下的脚本,但它返回一个刻度线(2 或 3 个单元格)和一些中断。

b(~isnan(b))=9;      % sea cells will be 9
b(isnan(b))=98672;   % land cells will be 98672
for i=1:255
    for j=2:119
        if b(i,j)==9
            if ((b(i,j-1)==98672)||(b(i,j+1)==98672))
                b(i,j-1)=333;      % 333 will be the coastline
            end
if ((b(i-1,j)==98672)||(b(i+1,j)==98672))
                b(i,j-1)=333;
            end
        end
    end
end
b(b==98672)=NaN;
b(b==9)=0.001;

pcolor(b);shading flat

中断发生在我们在海岸有岛屿或 V 形的点上。

你能帮我吗?请也给我发电子邮件。apt.man@gmail.com

4

2 回答 2

2

这是一个形态分析的问题,可以通过膨胀算子很容易地解决。为了效率,制作一个逻辑矩阵并减去膨胀

a             = false (size (b));
a(~isnan (b)) = true;
coastline     = imdilate (a, logical (ones (3))) - a;

这段代码在 Octave 中工作,但在 Matlab 中我相信你需要图像处理工具箱。如果你没有它,Octave 代码应该可以在 Matlab 中运行,只需稍作调整。基本上,它的行是dilated = filter2 (se, im) > 0;.

尝试使用不同的结构元素('imdilate' 的第二个参数)以对顶点上发生的事情产生不同的影响。例如,不要使用正方形,而是尝试使用十字形,[0 1 0; 1 1 1; 0 1 0]

于 2012-08-24T21:11:55.710 回答
1

这也可以:

diff([zeros(size(b,1),1) isnan(b)], [],2) ~= 0

您将获得一个逻辑矩阵,其中的true条目是沿海单元格。

于 2012-08-25T05:49:56.143 回答