Matlab 2012a获得边界/边界单元格

时间:2012-08-24 19:26:03

标签: matlab matrix

我有一个地形数据矩阵,这是一个很大的数据。 我用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, what is the best way to trace a boarder in a matrix that is changing each step? 但我无法使用它获得理想的海岸线。 我也写了一个脚本,但是它会返回一个tick(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

2 个答案:

答案 0 :(得分:2)

这是形态分析的问题,dilation operator可以很容易地解决。为了提高效率,请制作逻辑矩阵并减去膨胀

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

此代码适用于Octave,但在Matlab中我相信您需要图像处理工具箱。如果你没有它,Octave code应该在Matlab中稍作调整。基本上,执行此操作的行是dilated = filter2 (se, im) > 0;

尝试使用不同的结构元素('imdilate'的第二个参数)来对顶点上发生的事情产生不同的影响。例如,尝试交叉[0 1 0; 1 1 1; 0 1 0]

而不是正方形

答案 1 :(得分:1)

这也可以:

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

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