Я вычисляю кратчайшее расстояние от каждого пикселя переднего плана до фонового. Я попробовал несколько вариантов, но не работал, как я думал (есть встроенная функция Matlab «bwdist» дает расстояние между этим пикселем и ближайшим ненулевым пикселем. Но я создаю свой собственный, чтобы дать расстояние между 1 -пиксель и ближайший нулевой пиксель.) Вот одна из версий, которые у меня есть.Рассчитайте кратчайшее расстояние каждого 1-пикселя до любого нулевого пикселя в Matlab
Say «Im» является исходная матрица с 10x10 пикселей (Он был случайно создан. Действительная матрица гораздо больше, чем это.)
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