我有一个地形数据矩阵,这是一个很大的数据。 我用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答案 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
条目是沿海单元格。