2016-08-10 3 views
0

Я пытаюсь найти все прямые (вертикальные или диагональные) изображения с помощью Matlab. Проблема в том, что она включает в себя любую линию даже горизонтальных линий. это мой код. Как я могу обнаружить все прямые линии на изображении ниже (они могут быть между 45 и 115 градусами)?Как определить линии в определенном диапазоне углов с помощью преобразования Hough

function [linesnum, avg]= hh(inp_file,tresh) 

I = imread(inp_file); 

BW = edge(I,'canny'); 
% [H,T,R] = hough(BW,'Theta', 45:0.5:90); % it has no efect 

[H,T,R] = hough(BW); 
P = houghpeaks(H,300,'threshold',ceil(0.3*max(H(:)))); 

lines = houghlines(BW,T,R,P,'FillGap',10,'MinLength',30); 

if (do_plot) 
    figure, imshow(I), hold on 
    x = T(P(:,2)); 
    y = R(P(:,1)); 
    plot(x,y,'s','color','black'); 
end 
max_len = 0; 
linesnum = 0; 
sumLen = 0; 

for k = 1:length(lines) 
    xy = [lines(k).point1; lines(k).point2]; 
    vert = xy(1,1)==xy(2,1); 
    if (do_plot) 
     plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); 

     % Plot beginnings and ends of lines 
     plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); 
     plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); 
    end 

    len = norm(lines(k).point1 - lines(k).point2); 
    sumLen = sumLen + len; 

    linesnum = linesnum +1; 

end 
avg = sumLen/linesnum; 
end 

enter image description here

Это образец изображения:

enter image description here


Существует аналогичный question для обнаружения сетки, но это, кажется, в этом вопросе они полагаются на отверстиях сетку, чтобы определить шаблон сетки и ее ориентацию, в то время как мой вход отличается.

+0

Ваш вопрос связан с отмеченным дубликатом. Посмотрите на ответ Амро для понимания. – rayryeng

+0

@rayryeng Кажется, что в этом вопросе они полагаются на отверстия сетки, чтобы обнаружить шаблон сетки и ее ориентацию, в то время как мой ввод отличается от другого. – Ahmad

+0

Сначала вам нужно выполнить обнаружение края, что вы уже делаете. Я все равно попытаюсь сделать то, что они делают. Если это действительно не сработает, я подумаю о повторном открытии. – rayryeng

ответ

0

После обнаружения прямых линий с использованием преобразования hough вы можете измерить угол каждой линии, и если бы он находился в диапазоне, выберите его.

% after extracting straight lines using Haugh transform. 
for k = 1:length(lines) 

    xy = [lines(k).point1; lines(k).point2]; 

    deltaY = xy(2,2) - xy(1,2); 
    deltaX = xy(2,1) - xy(1,1); 
    % calculate the angle of line 
    angle = atan2(deltaY, deltaX) * 180/pi; 
    if (angle > 45 && angle < 115) 

     plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); 

     % Plot beginnings and ends of lines 
     plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); 
     plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');   
    end 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^