2

我正在使用MATLAB。我想用canny方法進行邊緣檢測。但我需要的是對角線的邊緣或只有40至50度角的邊緣。我怎樣才能做到這一點?使用canny方法在一定程度上的邊緣檢測

+0

或者您可以旋轉圖片! :P –

+0

我認爲你正在尋找*「羅伯茨十字架」*卷積 - https://en.wikipedia.org/wiki/Roberts_cross –

+0

我已經回答了類似的問題http://stackoverflow.com/questions/41020357 /取向-精明邊緣檢測/ 41291720#41291720 – Cecilia

回答

2

你需要自己編寫canny邊緣檢測器的代碼(你會得到很多的實現)在互聯網上。然後,您將在第二步中計算梯度幅度和梯度方向。你需要過濾掉角度和相應的大小。

希望這可以幫助你。

0

我已經回答了一個類似的問題,關於如何使用Matlab的edge函數來找到Canny的定向邊(Orientational Canny Edge Detection),但我也想嘗試一下由Avijit建議的自定義實現。

Canny Edge Detection steps

  1. 開始的圖像,我會使用一個內置的演示圖像。

    A = im2double(rgb2gray(imread('peppers.png'))); 
    
  2. 高斯濾波器

    A_filter = imgaussfilt(A); 
    
  3. 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); 
    
  4. 在該步驟中,我們通過取向傳統倉邊緣(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; 
    
  5. 在剩餘的邊緣執行非最大抑制 - 這是爲了適應不同的角度最困難的部分。要找到精確的邊緣位置,可以比較兩個相鄰像素:對於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 
    
  6. 邊緣具遲滯的跟蹤 - 確定弱邊緣像素是否足夠接近(我用一個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 
    

這裏是我的結果。

Result image

正如你所看到的,刪除了其它邊緣方位,因爲檢測到更少的強烈像素對滯後一步一個非常負面的影響。調整high_threshold會有所幫助。另一種選擇是使用所有邊緣方向執行步驟5和6,然後使用diagonal_map提取對角線邊緣。