Реализуйте адаптивную сегментацию водосбора в Matlab

Я хотел бы реализовать «Адаптивную сегментацию водораздела» в Matlab. В этом алгоритме шесть шагов. Входные данные — это цифра (а), а результат — это цифра (г). Не могли бы вы помочь мне проверить, есть ли ошибка в моем коде, и я не знаю, как реализовать шестой шаг. Большое спасибо!

Входное изображение

Изображение результата

Загрузить изображение:

input_image = imread('test.gif');

Шаг 1: вычислить D(x,y) для каждого (x,y), получить карту евклидовых расстояний бинарного изображения и присвоить каждому значению 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);

ШАГ 5:

Сегментируйте карту расстояний по маркерам по обычному алгоритму водораздела и получите сегментацию бинарного изображения.

I2 = imimposemin(igfDT,M);
L = watershed(I2);
igfDT (L==0)=0;

Шаг 6: Выровняйте линии водораздела, соединив концы линий водораздела прямой линией и переклассифицировав пиксели вдоль прямой линии.

Я не знаю, как реализовать этот шаг


person Hsiao Ai Lee    schedule 10.04.2016    source источник


Ответы (1)


Попробуйте преобразование расстояния, а затем преобразование водораздела.

im=imread('n6BRI.gif');

imb=bwdist(im);

sigma=3;
kernel = fspecial('gaussian',4*sigma+1,sigma);
im2=imfilter(imb,kernel,'symmetric');

L = watershed(max(im2(:))-im2);
[x,y]=find(L==0);

lblImg = bwlabel(L&~im);

figure,imshow(label2rgb(lblImg,'jet','k','shuffle'));

введите здесь описание изображения

person Ozcan    schedule 09.03.2017