2

私はMATLABを使用しています。私はエッジ検出のためにcannyメソッドを使いたい。しかし、私は斜めのエッジ、または40〜50度の角度しかないエッジが必要です。どうやってやるの?cannyメソッドを使用してある程度のエッジ検出

+0

また、画像を回転することもできます。 :P –

+0

あなたは* "Roberts cross" * convolutionを探していると思います - https://en.wikipedia.org/wiki/Roberts_cross –

+0

私は同様の質問に答えましたhttp://stackoverflow.com/questions/41020357/orientational-canny-edge-detection/41291720#41291720 – Cecilia

答えて

2

あなたは自分でインターネットでcannyエッジ検出器のコードを書く必要があります(実装がたくさんあります)。次に、2番目のステップで勾配の大きさと勾配方向を計算します。そこでは、角度と対応する大き​​さをフィルタリングする必要があります。

希望すると、これが役立ちます。

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. 残りのエッジ上の非最大抑制を実行する - これは、異なる角度に適応するための最も困難な部分です。正確なエッジ位置を見つけるには、隣接する2つのピクセルを比較します。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. エッジ - 弱いエッジ画素が強いエッジ画素に(私は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 
    

私の結果です。

Result image

あなたが見ることができるように、より少ない強い画素が検出されるので、他のエッジ方向を廃棄するヒステリシスステップに非常にマイナスの効果を有します。 high_thresholdを調整すると多少役立ちます。もう1つのオプションは、すべてのエッジ方向を使用してステップ5と6を実行し、diagonal_mapを使用して対角エッジを抽出することです。

関連する問題