2017-02-12 20 views
0

各フォアグラウンドピクセルからバックグラウンドピクセルまでの最短距離を計算しています。私はいくつかのオプションを試しましたが、意図したとおりに動作しませんでした(Matlabの組み込み関数 'bwdist'は、そのピクセルと最も近い非ゼロピクセルの間の距離を示します。 -pixelと最も近いゼロピクセル)。ここに私が持っているバージョンの1つがあります。Matlabの各1ピクセルから任意のゼロピクセルまでの最短距離を計算します

セイ「イム」は10×10ピクセルの元の行列である(これは、ランダムに作成されました。実際の行列はこれよりもはるかに大きいです。)

Im = 
0  0  0  0  0  0  0  0  0 
0  0  0  1  1  1  1  0  0 
0  0  0  1  1  1  1  1  0 
0  0  1  0  1  1  1  1  1 
0  0  1  1  1  1  1  1  1 
0  0  0  1  1  1  1  1  0 
0  0  0  0  1  1  1  1  0 
0  0  0  0  1  1  1  1  0 
0  0  0  0  0  1  1  0  0 
0  0  0  0  0  0  0  0  0 

DT = Im;%create a copy matrix of Im 
for i = 1: size(DT,1) 
    for j = 1: size(DT,2) 
     %I want to select all pixels with a distance of 1 to current pixel 
     %(i,j), e.g. (i-1,j), (i,j-1), (i+1,j),(i,j+1) would be the case for Euclidean 
     %distance. The large size of matrix (say 512x512) also makes it very inefficient 
     %use four for-loops to find these pixels with distance of 1 to current pixel. So 
     %I use (i-1,j) etc instead of using 
     %sqrt(sum(bsxfun(@minus,[u v],[i j]).^2,2)) 
     %to find out all (u,v)s with distance of 1 to current pixel (i,j). 
     %But I do believe there are thousands smart ways to make this work efficiently. 

     if (Im(i-1,j) == 0 || Im(i,j-1) == 0 || Im(i,j+1) == 0 || Im(i+1,j) == 0)%I want to mark all pixels with 0 to remain as 0 
      DT(i-1,j) = Im(i-1,j); 
      DT(i,j-1) = Im(i-1,j); 
      DT(i,j+1) = Im(i,j+1); 
      DT(i+1,j) = Im(i+1,j); 

     else 
     %I want to update the visited pixels with the minimum value 
     %of calculated distances. Apparently, here is my problem. The code is not correct. 

      DT(i-1,j) = min(DT(i-1,j),Im(i-1,j) + DT(i,j)); 
      DT(i,j-1) = min(DT(i,j-1),Im(i,j-1) + DT(i,j)); 
      DT(i,j+1) = Im(i,j+1) + DT(i,j)); 
      DT(i+1,j) = Im(i+1,j) + DT(i,j); 
     end  
    end 
end 

おかげで事前に任意の助けのためにたくさん!

+0

'bwdist(1-Im)'についてはどうですか? – aksadv

+0

これはbwdist(〜Im)を使って動作します。しかし、私は上記のコードが同じように動作するかどうかを調べるために遊んでいます。 – Orangeblue

答えて

0

があり組み込み、そのピクセルと最も近いゼロ以外の画素との間の距離 を与えるMATLAB関数bwdist。しかし、私は自分の 自分自身を作成し​​て、1ピクセルと最も近いゼロの間の距離を与えます ピクセル。

自分が作成しようとしているものに対してまだbwdistを使用できるため、独自の関数を作成する必要はありません。次の例に示すように、自分のイメージを反転してからbwdistを使用するようにlogical NOT ~を使用することができます。

% Binary image. 
Im = [ 
    0 0 0 
    0 1 0 
    0 0 0]; 

% Distance transform of binary image. 
D1 = bwdist(Im) 

% Distance transform of inverted binary image. 
D2 = bwdist(~Im) 

出力:

D1 = 
    1.4142 1.0000 1.4142 
    1.0000   0 1.0000 
    1.4142 1.0000 1.4142 
D2 = 
    0  0  0 
    0  1  0 
    0  0  0 
+0

ニースを見つけよう!しかし私は、私が質問で与えた基本的な考え方、それがbwdistなしでうまくいくようにするにはどうすればいいのでしょうか?感謝する。 – Orangeblue

0

を私は自分でそれを考え出しました。ここに私のコードは次のとおりです。また

DT = Im;%create a copy matrix of Im 
for i = 1: size(DT,1) 
    for j = 1: size(DT,2) 
      %I want to select all pixels with a distance of 1 to current pixel 
     %(i,j), e.g. (i-1,j), (i,j-1), (i+1,j),(i,j+1) would be the case for Euclidean 
     %distance. The large size of matrix (say 512x512) also makes it very inefficient 
     %use four for-loops to find these pixels with distance of 1 to current pixel. So 
     %I use (i-1,j) etc instead of using 
     %sqrt(sum(bsxfun(@minus,[u v],[i j]).^2,2)) 
     %to find out all (u,v)s with distance of 1 to current pixel (i,j). 
     %But I do believe there are thousands smart ways to make this work efficiently. 

     if (Im(i-1,j) == 0 || Im(i,j-1) == 0 || Im(i,j+1) == 0 || Im(i+1,j) == 0)%I want to mark all pixels with 0 to remain as 0 
      DT(i-1,j) = Im(i-1,j); 
      DT(i,j-1) = Im(i-1,j); 
      DT(i,j+1) = Im(i,j+1); 
      DT(i+1,j) = Im(i+1,j); 

     else 
     %I want to update the visited pixels with the minimum value 
     %of calculated distances. Apparently, here is my problem. The code is not correct. 

      DT(i-1,j) = min(DT(i-1,j),Im(i-1,j) + DT(i,j)); 
      DT(i,j-1) = min(DT(i,j-1),Im(i,j-1) + DT(i,j)); 
      DT(i,j+1) = min(DT(i,j+1),Im(i,j+1) + DT(i,j)); 
      DT(i+1,j) = Im(i+1,j) + DT(i,j); 
     end  
    end 
end 

、ループが存在する場合、最小値でDTを交換するために下から上にスキャンすることがあります。

関連する問題