2

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

Input image

Result image

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

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

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

ответ

1

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

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')); 

enter image description here