Я хотел бы реализовать «Адаптивное разделение водоразделов» в Matlab. В этом алгоритме есть шесть шагов. Ввод - это цифра (a), а результат - цифра (d). Не могли бы вы помочь мне проверить, есть ли ошибка в моем коде, и я не знаю, как реализовать шестой шаг. Большое вам спасибо!Реализовать адаптивную сегментацию водораздела в Matlab
Загрузить изображение:
input_image = imread('test.gif');
Шаг 1: Вычислить Д (х, у) в каждой (х, у), получим евклидово расстояние карта бинарного изображения и присвоить каждое значение M (x, y) как 0.
DT = bwdist(input_image,'euclidean'); % Trandform distance:Euclidian distance
[h,w]=size(DT);
M = zeros(h,w);
Этап 2 : Сгладить карту расстояния с помощью гауссова фильтра для слияния смежных максимумов, положим M (x, y) как 1, если D (x, y) - локальный максимум, а затем получить карту маркеров карты расстояния.
H = fspecial('gaussian');
gfDT = imfilter(DT,H);
M = imregionalmax(gfDT); % maker map, M = local maximum of gfDT
Шаг 3: Сканирование карты маркера по пикселям. Если M (x0, y0) равно 1, искать паразитные максимумы в своей окрестности с радиусом D (x, y). Когда M (x, y) равно 1 и sqr ((x - x0)^2 + (y - y0)^2) ≤ D (x0, y0), положим M (x, y) как 0, если D (x, y) < D (x0, y0).
for x0 = 1:h
for y0 = 1:w
if M(x0,y0) == 1
r = ceil(gfDT(x0,y0));
% range begin:(x0-r,y0-r) end:(x0+r,y0+r)
xb = x0-r;
if xb <= 0
xb =1;
end
yb = y0-r;
if yb <= 0
yb =1;
end
xe = x0+r;
if xe > w
xe = w;
end
ye = y0+r;
if ye > h
ye = h;
end
for x = yb:ye
for y = xb:xe
if M(x,y)==1
Pos = [x0,y0 ;x,y];
Dis = pdist(Pos,'euclidean');
IFA = Dis<= (gfDT(x0,y0));
IFB = gfDT(x,y)<gfDT(x0,y0);
if (IFA && IFB)
M(x,y) = 0;
end
end
end
end
end
end
end
Шаг 4:
Вычислить обратные расстояния карты, а также локальные максимумы оказываются локальные минимумы.
igfDT = -(gfDT);
Step5:
Сегмент расстояние на карту в соответствии с маркерами по обычному алгоритму водосборных бассейнов и получить сегментации бинарного изображения.
I2 = imimposemin(igfDT,M);
L = watershed(I2);
igfDT (L==0)=0;
Шаг 6: Выправит водораздел линию, связывая концы линий водосбора с прямой линией и реклассификацией пикселей вдоль прямой линии.
Я не знаю, как реализовать этот шаг