Теперь я вижу проблему: вы передаете 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 не так эффективен с рекурсией, вы, скорее всего, не увидите разницу в этом конкретном фрагменте кода.