Matlab Image Blob Detection с использованием рекурсивной заливки - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь обнаружить капли в Matlab.Как я могу избавиться от моей бесконечной рекурсии в flood_fill ().

%Input Image
blobs = im2bw(imread('Week6Image.jpg'),0.1);

disp(blobs);

[W, H] = size(blobs);

region_labeling(blobs,W,H)



function region_labeling(I,W,H)

label = 2;

for u = 1 : W
    %For loop vertical Axis
    for v = 1 : H
        if I(u,v) == 1
            flood_fill(I,u,v,label,W,H);
            label = label + 1;
        end
    end

end

end

Она застревает в этой функции из-за бесконечной рекурсии.Что мне делать, чтобы оно вспыхнуло в нужное время.

function flood_fill(I,u,v,label,W,H)

if u >= 1 && u < W && v >= 1 && v < H && I(u,v) == 1
    I(u,v) = label;
    flood_fill(I,u+1,v,label,W,H);
    flood_fill(I,u,v+1,label,W,H);
    flood_fill(I,u,v-1,label,W,H);
    flood_fill(I,u-1,v,label,W,H);


end
end

1 Ответ

0 голосов
/ 08 декабря 2018

Теперь я вижу проблему: вы передаете I в функцию, но не получаете изменений обратно.MATLAB передает все аргументы по значению (за исключением классов дескрипторов).Это означает, что функция может изменять свои входные аргументы без изменения значения этих матриц в рабочей области вызывающего.Вам нужно изменить функцию flood_fill, чтобы она возвращала I.

Другая проблема заключается в том, что blobs является логическим массивом, и присвоение ему любого ненулевого значения приводит к значению 1. Вынеобходимо привести его к какому-либо другому типу, либо удваивается с +blobs, либо с конкретным целочисленным типом, как показано ниже.

Это исправленный код:

blobs = im2bw(imread('Week6Image.jpg'),0.1);
blobs = uint16(blobs); % or uint32 if you have many regions
[W, H] = size(blobs);
out = region_labeling(blobs,W,H);

function I = region_labeling(I,W,H)
label = 2;
for u = 1 : W
   %For loop vertical Axis
   for v = 1 : H
      if I(u,v) == 1
         I = flood_fill(I,u,v,label,W,H);
         label = label + 1;
      end
   end
end
end

function I = flood_fill(I,u,v,label,W,H)
if u >= 1 && u <= W && v >= 1 && v <= H && I(u,v) == 1
   I(u,v) = label;
   I = flood_fill(I,u+1,v,label,W,H);
   I = flood_fill(I,u,v+1,label,W,H);
   I = flood_fill(I,u,v-1,label,W,H);
   I = flood_fill(I,u-1,v,label,W,H);
end
end

Обратите внимание также, что это полезнов двойном цикле, чтобы иметь наиболее быстро изменяющийся индекс, будет внутренний цикл.MATLAB является главным столбцом, поэтому в I(u,v), u является самым быстро меняющимся индексом.Таким образом, в идеале вы должны поменять местами два цикла.Но, учитывая, что это такой медленный алгоритм и что MATLAB не так эффективен с рекурсией, вы, скорее всего, не увидите разницу в этом конкретном фрагменте кода.

...