我想用Canny方法檢測邊緣。最後我想要兩個邊緣地圖:1代表水平1代表垂直方向。方向性Canny邊緣檢測
在MATLAB中,可以通過使用帶有額外方向參數的Sobel或Prewitt運算符來實現,但對於Canny,我們沒有這個選項。
E = edge(I,'Sobel','horizontal')
任何想法如何通過使用Canny分別提取水平和垂直邊緣?
我想用Canny方法檢測邊緣。最後我想要兩個邊緣地圖:1代表水平1代表垂直方向。方向性Canny邊緣檢測
在MATLAB中,可以通過使用帶有額外方向參數的Sobel或Prewitt運算符來實現,但對於Canny,我們沒有這個選項。
E = edge(I,'Sobel','horizontal')
任何想法如何通過使用Canny分別提取水平和垂直邊緣?
有沒有辦法使用edge
內置功能。但是,Canny邊緣檢測使用Sobel Operator的角度。重現這些值非常容易。
從圖像開始,我將使用內置的演示圖像。
A = im2double(rgb2gray(imread('peppers.png')));
獲取坎尼邊緣
A_canny = edge(A, 'Canny');
Sobel算子 - 我們不能使用內置的實現(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);
在邊緣位置獲取的角度值
A_canny_angles = nan(size(A));
A_canny_angles(A_canny) = A_angle(A_canny);
選擇您感興趣的
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.提取的水平線的最終結果顯示在右下角。你可以看到它們並不完全水平,因爲我使用了這麼大的角度容差窗口。這是一個可調參數,取決於您想要達到目標角度的準確程度。
對我來說看起來不錯。謝謝! –
應該先閱讀是如何工作的Canny邊緣算法... Canny邊緣檢測是bidirectionnal,這是沒有意義的提取水平或垂直邊緣。 – obchardon
[如何工作canny邊緣檢測](http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html#steps) – obchardon
@obchardon從您提供的鏈接:「方向被四捨五入爲四個可能的角度之一(即0,45,90或135)「所以我假設那些是垂直的,水平的,對角線左的,對角線的右邊的。我只對垂直和水平感興趣。 –