我正在使用MATLAB。我想用canny方法進行邊緣檢測。但我需要的是對角線的邊緣或只有40至50度角的邊緣。我怎樣才能做到這一點?使用canny方法在一定程度上的邊緣檢測
回答
你需要自己編寫canny邊緣檢測器的代碼(你會得到很多的實現)在互聯網上。然後,您將在第二步中計算梯度幅度和梯度方向。你需要過濾掉角度和相應的大小。
希望這可以幫助你。
我已經回答了一個類似的問題,關於如何使用Matlab的edge
函數來找到Canny的定向邊(Orientational Canny Edge Detection),但我也想嘗試一下由Avijit建議的自定義實現。
開始的圖像,我會使用一個內置的演示圖像。
A = im2double(rgb2gray(imread('peppers.png')));
高斯濾波器
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
邊緣具遲滯的跟蹤 - 確定弱邊緣像素是否足夠接近(我用一個3x3窗口),以強大的邊緣像素。如果是,請將它們包含在邊緣。如果不是,他們是噪音;刪除它們。
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
這裏是我的結果。
正如你所看到的,刪除了其它邊緣方位,因爲檢測到更少的強烈像素對滯後一步一個非常負面的影響。調整high_threshold會有所幫助。另一種選擇是使用所有邊緣方向執行步驟5和6,然後使用diagonal_map提取對角線邊緣。
- 1. Canny邊緣檢測的梯度方向
- 2. Canny邊緣檢測
- 3. Canny邊緣檢測器C
- 4. Canny邊緣檢測器
- 5. 方向性Canny邊緣檢測
- 6. MATLAB中的Canny邊緣檢測器
- 7. OpenCV的Canny邊緣檢測C++
- 8. Android的Canny邊緣檢測器
- 9. java中的canny邊緣檢測器
- 10. Matlab的:Canny邊緣檢測器
- 11. Canny邊緣檢測和LoG差異
- 12. canny邊緣檢測後查找輪廓
- 13. Canny邊緣檢測器檢測到所述圖像的邊界
- 14. 獲取邊緣檢測後的邊緣座標(Canny)
- 15. 在Canny邊緣檢測使用「簡單」和「短」高斯函數
- 16. 自動設置Canny邊緣檢測算法參數的實用方法
- 17. 執行Canny邊緣檢測兩次 - >更好的線檢測?
- 18. Canny邊緣檢測算法 - 實現問題
- 19. 在Canvas中創建Canny邊緣檢測的形狀
- 20. 在Canny邊緣檢測中出現錯誤
- 21. 如何在Java中實現Canny邊緣檢測器和android studio
- 22. 如何在javacv/opencv中執行canny邊緣檢測?
- 23. Android的Canny邊緣檢測器 - 遞歸函數的StackOverflow
- 24. 如何增加canny filtrer檢測到的邊緣的連續性
- 25. 在Opencv中使用Canny邊緣檢測識別圖像中的文本
- 26. Canny邊緣檢測 - 灰度圖像始終顯示爲3通道,不可用?
- 27. 簡單的邊緣檢測方法Java
- 28. OpenCV Canny邊緣檢測C++中的視頻
- 29. Canny邊緣檢測器 - 執行中的問題
- 30. Canny邊緣檢測器的填充結果opencv
或者您可以旋轉圖片! :P –
我認爲你正在尋找*「羅伯茨十字架」*卷積 - https://en.wikipedia.org/wiki/Roberts_cross –
我已經回答了類似的問題http://stackoverflow.com/questions/41020357 /取向-精明邊緣檢測/ 41291720#41291720 – Cecilia