Я использую MATLAB. Я хочу использовать canny метод для обнаружения края. Но мне нужны края, которые диагональны или края, которые имеют только угол от 40 до 50 градусов. Как я могу это сделать?Обнаружение края в определенной степени с использованием canny метода
ответ
Вам нужно написать собственный код детектора каньона по своему усмотрению (вы получите много реализаций) в Интернете. Затем вы должны были бы вычислять градиентные величины и направления градиента на втором этапе. Там вам нужно отфильтровать углы и соответствующие величины.
Надеюсь, это вам поможет.
Я ответил на аналогичный вопрос о том, как использовать функцию Matlab edge
, чтобы найти ориентированные ребра с Canny (Orientational Canny Edge Detection), но я также хотел попробовать пользовательскую реализацию, предложенную Avijit.
Начать с изображением, я буду использовать встроенный в демо-изображения.
A = im2double(rgb2gray(imread('peppers.png')));
Gaussian фильтр
A_filter = imgaussfilt(A);
Sobel Edge Detection - Мы не можем использовать встроенные в реализации (
edge(A_filter, 'Sobel')
), потому что мы хотим, чтобы углы края, а не только краевые местоположения так мы реализуем нашего собственного оператора.a. Свертка для поиска ориентированных градиентов
%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');
b. Вычисление углов
A_angle = arctan(A_vertical./A_horizontal);
На этом шаге мы традиционно бен края по ориентации (0 °, 45 °, 90 °, 135 °), но так как вы хотите только диагональные ребра между 40 и 50 градусов, мы будем сохраните эти края и отбросьте остальные.
% I lowered the thresholds to include more pixels % But for your original post, you would use 40 and 50 lower_angle_threshold = 22.5; upper_angle_threshold = 67.5; diagonal_map = zeros(size(A), 'logical'); diagonal_map (A_angle>(lower_angle_threshold*pi/180) & A_angle<(upper_angle_threshold*pi/180)) = 1;
Выполнение без максимального подавления на остальных ребрах - Это самая трудная часть, чтобы адаптироваться к различным углам. Чтобы найти точное местоположение края, вы сравниваете два соседних пикселя: для краев 0 °, сравните восток-запад, для 45 ° юго-западного пикселя к северо-восточному пикселю, для сравнения на 90 ° с севера на юг и на 135 ° северно- западного пикселя к юго-восточному пикселю.
Поскольку ваш желаемый угол близок к 45 °, я просто использовал юго-запад, но, если вы хотите, например, от 10 ° до 20 °, вам нужно было бы подумать над этими сравнениями.
non_max = A_sobel; [n_rows, n_col] = size(A); %For every pixel for row = 2:n_rows-1 for col = 2:n_col-1 %If we are at a diagonal edge if(diagonal_map(row, col)) %Compare north east and south west pixels if(A_sobel(row, col)<A_sobel(row-1, col-1) || ... A_sobel(row, col)<A_sobel(row+1, col+1)) non_max(row, col) = 0; end else non_max(row, col) = 0; end end end
края отслеживание с гистерезисом - Решают ли слабые краевые пиксели достаточно близко (я использую окно 3х3) для сильных краевых пикселей. Если они есть, включите их в край. Если нет, это шум; удалить их.
high_threshold = 0.5; %These thresholds are tunable parameters low_threshold = 0.01; weak_edge_pixels = non_max > low_threshold & non_max < high_threshold; strong_edge_pixels = non_max > high_threshold; final = strong_edge_pixels; for row = 2:n_rows-1 for col = 2:n_col-1 window = strong_edge_pixels(row-1:row+1, col-1:col+1); if(weak_edge_pixels(row, col) && any(window(:))) final(row, col) = 1; end end end
Вот мои результаты.
Как можно видеть, отбрасывая другой край ориентации имеет очень отрицательный эффект на стадии гистерезиса, поскольку меньшее количество сильных пикселей обнаружения. Корректировка высокого порога несколько помогла бы. Другим вариантом было бы сделать шаги 5 и 6, используя все ориентации кромки, а затем использовать diagonal_map для извлечения диагональных ребер.
Или вы можете вращать изображение! : P –
Я думаю, что вы ищете * «Roberts cross» * convolution - https://en.wikipedia.org/wiki/Roberts_cross –
Я ответил на аналогичный вопрос http://stackoverflow.com/questions/41020357/ориентационное-осторожный край обнаружение/41291720 # 41291720 – Cecilia