【问题标题】:Matlab 2012a get border/boundary cellsMatlab 2012a 获取边界/边界单元格
【发布时间】:2012-08-24 19:26:02
【问题描述】:

我有一个地形数据矩阵,它很大。 我已经用 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? 但我无法使用它获得想要的海岸线。 我也写了一个如下的脚本,但它返回一个刻度线(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

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    这是一个形态分析问题,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]

    【讨论】:

      【解决方案2】:

      这也可以:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多