Нужна помощь в визуализации строк с помощью встроенного детектора Хафа в matlab

#matlab #hough-transform #houghlines

#matlab #хаф-преобразование #линии Хафа

Вопрос:

Мне удалось воссоздать функции хафа () и хафа () в Matlab со следующими кодами, но в настоящее время я изо всех сил пытаюсь перенести их из пространства параметров в пространство изображений.

 %%% hough() function

corridor = imread('Corridor1.jpg');
grayCorridor = rgb2gray(corridor);
Canny_img = edge(grayCorridor, 'Canny');
[rows, cols] = size(Canny_img);
theta_maximum = 90;
rho_maximum = hypot(rows,cols) - 1;
theta_range = -theta_maximum:theta_maximum-1;
rho_range = -rho_maximum:rho_maximum;

Hough = zeros(length(rho_range), length(theta_range));
for j = 1:rows
    for i = 1:cols
        if Canny_img(j, i) ==1
            x = i - 1;
            y = j - 1;
            for T = theta_range
                R = round((x * cosd(T))   (y * sind(T)));
                R_Index = R   rho_maximum   1;
                T_Index = T   theta_maximum   1;
                Hough(R_Index, T_Index) = Hough(R_Index, T_Index)   1;
            end
        end
    end
end

%%% houghpeaks() function

[X,Y] = find(Hough>0.47*max(Hough(:)))

%Visualising them 

imshow(Hough,[],'XData',theta_range,'YData',rho_range,...
            'InitialMagnification','fit');
xlabel('theta'), ylabel('rho');
axis on, axis normal, hold on;

pointsRho = rho_range(X(:));
pointsTheta = theta_range(Y(:));
plot(pointsTheta,pointsRho,'s','color','red');

  

Пространство Хафа с пиками
Вот моя попытка перенести их в пространство изображения. Сначала я добавляю пару Rho и Theta в список. Затем я создал набор двоичных матриц размером imageRow x imageColumn x номер пары rhotheta.
Затем я подставляю все координаты пикселей x и y в функцию x cos (theta) y sin (theta) = rho, и если left — right == 0, я бы пометил местоположение двоичной матрицы (x, y) как 1, и я выполняю это для всех тетасопоставьте все значения x и y и сохраните их отдельно в наборе двоичных матриц, упомянутых выше.

Во втором цикле for я просто просмотрел весь набор двоичных матриц, которые я получил, и просто объединил их в одну двоичную матрицу. Моя проблема возникает здесь: как мне объединить строки, которые я выделил, в одну строку, когда они находятся близко друг к другу? Если я смогу это сделать, я мог бы визуализировать больше хафа, снизив порог, который я установил с помощью [X,Y] = find(Хаф> 0,47 * макс (Хаф (:))) . Потому что прямо сейчас, если бы я снизил пороговое значение даже на 0,01, у меня было бы намного больше строк, которые находятся так близко друг к другу. И, возможно, у вас есть более элегантный и лучший способ удаления хафа?

 for k = 1:length(pointsRho)
    for i = 1:1280 % Shoulda put 1:size(Canny_img,1) but putting number helps me visualise my logic 
                   % better while I am coding
        for j = 1:960
            r = pointsRho(k);
            t = pointsTheta(k);
            threshold = abs(i*cosd(t) j*sind(t)-r);
            if threshold ==0
                allLines(j,i,k) = 1;
            end     
        end
    end
end

aggregatedImage = zeros(size(Canny_img));
for k = 1:length(pointsRho)
    for j = 1:1280
        for i = 1:960
            if allLines(i,j,k) ==1
                aggregatedImage(i,j) = 1;
            end
        end
    end
end

figure,imshow(imfuse(aggregatedImage,corridor))

  

Разделение пиков на линии

P / S: я подумал, что, возможно, я мог бы объединить два цикла в один цикл for, если бы я сразу отметил все координаты пикселей, которые удовлетворяют x cos (theta) y cos (theta) = r только в одной двоичной матрице (как показано в следующем коде). Однако я не уверен, почему, когда я это сделал, aggregatedImage равен только 0. Поэтому я решил использовать вышеуказанный подход.

 aggregatedImage = zeros(size(Canny_img));

for k = 1:length(pointsRho)
    for i = 1:1280
        for j = 1:960
            r = pointsRho(k);
            t = pointsTheta(k);
            threshold = abs(i*cosd(t) j*sind(t)-r);
            if threshold ==0
                aggregatedImage(j,i) = 1;
            end     
        end
    end
end
  

Комментарии:

1. Строго говоря, это не является частью HoughTransform. Вам нужен какой-то алгоритм, который объединяет решения, близкие друг к другу. В Houghspace вы можете искать для каждой точки, близки ли другие точки, а затем взять их центр тяжести, взвешенный по совокупности каждого пика. Кроме того, если клиент — человек, вы могли бы просто сделать строки с низкими агрегатами слабее. Большинство применений HoughTransform не пытаются быть настолько универсальными. Большую часть времени вы знаете, что ищете, квадрат или круг определенного размера, поэтому вы просто устанавливаете его пороговое значение (или работаете с подсветкой).

2. @roadrunner66 ага, теперь у меня есть агрегированные двоичные матрицы, мне просто проверить, имеет ли значение слева, справа, вверх, вниз 1, и удалить / сохранить их? Есть ли хороший способ сделать это? Я не уверен, как я могу этого добиться, поскольку линии имеют разный градиент и т.д.

3. В пространстве Хафа близость означает аналогичный наклон и аналогичное расстояние до начала координат, т.Е. Аналогичную линию. Одна вещь, которую вы могли бы сделать, это выполнить свертку пространства Хафа с помощью гауссова (тем самым усредняя и создавая один пик из многих близких).). Затем после завершения снова найдите максимальные пики. Таким образом, вы случайно увеличиваете разрешение, поскольку теперь несколько близких пиков вносят свой вклад в ваш пик, ваш новый пик имеет нецелочисленное разрешение в пространстве Хафа.