2016-12-07 4 views
2

Я хочу определить края с помощью метода Canny. В конце я хочу две карты кромок: 1 для горизонтали 1 для вертикального направления.Ориентация обнаружения пещерного края

В MATLAB это может быть достигнуто с помощью операторов Sobel или Prewitt с дополнительным аргументом направления, но для Canny у нас нет этой опции.

E = edge(I,'Sobel','horizontal') 

Любая идея, как извлечь как горизонтальные, так и вертикальные края, отдельно, используя Canny?

+0

Вы должны сначала прочитать, как работать хитрый краевой алгоритм ... хитрое обнаружение края Двунаправленное, это не имеет смысла извлекать горизонтальные или вертикальные края. – obchardon

+0

[как работает обнаружение сложенного края] (http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html#steps) – obchardon

+0

@obchardon из указанной вами ссылки: «Направление округляется до одного из четырех возможных углов (а именно 0, 45, 90 или 135). Поэтому я предполагаю, что они предназначены для вертикальной, горизонтальной, диагональной-левой, диагональной-правой. Меня интересуют только вертикальные и горизонтальные. –

ответ

2

Невозможно использовать встроенную функцию edge. Тем не менее, обнаружение края Canny использует углы от Sobel Operator. Очень легко воспроизвести эти значения.

  1. Начните с изображения, я буду использовать встроенное демонстрационное изображение.

    A = im2double(rgb2gray(imread('peppers.png'))); 
    
  2. Получить Канни края

    A_canny = edge(A, 'Canny'); 
    
  3. Собел Оператор - Мы не можем использовать встроенные в реализации (edge(A_filter, 'Sobel')), потому что мы хотим, чтобы углы краев, а не только краевые расположения, поэтому мы реализуем собственный оператор.

    a. Гауссовский фильтр. Это предварительный шаг для Canny, поэтому мы должны, вероятно, воспроизвести его здесь

    A_filter = imgaussfilt(A); 
    

    b. Свертка для поиска ориентированных градиентов

    %These filters measure the difference in values between vertically or horizontally adjacent pixels. 
    %Effectively, this finds vertical and horizontal gradients. 
    vertical_filter = [-1 0 1; -2 0 2; -1 0 1]; 
    horizontal_filter = [-1 -2 -1; 0 0 0; 1 2 1]; 
    A_vertical = conv2(A_filter, vertical_filter, 'same'); 
    A_horizontal = conv2(A_filter, horizontal_filter, 'same'); 
    

    c. Вычислить углы

    A_angle = arctan(A_vertical./A_horizontal); 
    
  4. Получить значения углов в местах края

    A_canny_angles = nan(size(A)); 
    A_canny_angles(A_canny) = A_angle(A_canny); 
    
  5. Выберите углы, которые вы заинтересованы в

    angle_tolerance = 22.5/180*pi; 
    target_angle = 0; 
    A_target_angle = A_canny_angles >= target_angle*pi/180 - angle_tolerance & ... 
        A_canny_angles<= target_angle*pi/180 + angle_tolerance; 
    

Так что, если я глядя на горизонтальные линии, мой целевой угол будет равен нулю. На рисунке ниже показаны шаги 1, 2, 4 и 5. Окончательный результат извлеченных горизонтальных линий показан в правом нижнем углу. Вы можете видеть, что они не точно горизонтальны, потому что я использовал такое окно с большим углом наклона. Это настраиваемый параметр в зависимости от того, как именно вы хотите поразить целевой угол.

Result

+0

, который выглядит достаточно хорошо для меня. благодаря! –

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