各フォアグラウンドピクセルからバックグラウンドピクセルまでの最短距離を計算しています。私はいくつかのオプションを試しましたが、意図したとおりに動作しませんでした(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
おかげで事前に任意の助けのためにたくさん!
'bwdist(1-Im)'についてはどうですか? – aksadv
これはbwdist(〜Im)を使って動作します。しかし、私は上記のコードが同じように動作するかどうかを調べるために遊んでいます。 – Orangeblue