2012-08-24 157 views
1

我有一個地形數據矩陣,它是一個大的。 我已經取代土地數據與南與海洋深度數據是積極的。(一個小樣本可波紋管可以看出)Matlab 2012a獲取邊界/邊界單元格

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形狀的地方。

你能幫我嗎? 請給我發電子郵件。 [email protected]

回答

2

這是一個形態分析的問題,可以很容易地通過dilation operator來解決。爲了提高效率,使邏輯矩陣和減去擴張

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

這個代碼在八度,但在Matlab我相信你所需要的圖像處理工具箱。如果你沒有它,Octave code應該在Matlab中工作,幾乎沒有什麼調整。基本上,這條線是dilated = filter2 (se, im) > 0;

使用不同的結構元素('imdilate'的第二個參數)對頂點發生的不同效果進行實驗。例如,而不是方形,嘗試交叉,[0 1 0; 1 1 1; 0 1 0]

+0

謝謝你,你的代碼在matlab 2012a中完美工作, – user1623313

1

這將工作太:

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

你會得到一個合乎邏輯的矩陣,其中true項是沿海細胞。