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」の2番目の引数)を試して、頂点で何が起こるかについて異なる効果を持たせます。たとえば、正方形ではなく、十字を試してみてください。[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 に答える