私はMATLABを使用しています。私はエッジ検出のためにcannyメソッドを使いたい。しかし、私は斜めのエッジ、または40〜50度の角度しかないエッジが必要です。どうやってやるの?cannyメソッドを使用してある程度のエッジ検出
答えて
あなたは自分でインターネットでcannyエッジ検出器のコードを書く必要があります(実装がたくさんあります)。次に、2番目のステップで勾配の大きさと勾配方向を計算します。そこでは、角度と対応する大きさをフィルタリングする必要があります。
希望すると、これが役立ちます。
Matlabのedge
関数を使用してCanny(Orientational Canny Edge Detection)で方向付けされたエッジを見つける方法についても同様の質問に答えましたが、私はAvijitの示唆に従ってカスタム実装を試したかったのです。
Canny Edge Detection steps:画像と
スタート、私はデモ映像で構築を使用します。
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;
残りのエッジ上の非最大抑制を実行する - これは、異なる角度に適応するための最も困難な部分です。正確なエッジ位置を見つけるには、隣接する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
エッジ - 弱いエッジ画素が強いエッジ画素に(私は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
私の結果です。
あなたが見ることができるように、より少ない強い画素が検出されるので、他のエッジ方向を廃棄するヒステリシスステップに非常にマイナスの効果を有します。 high_thresholdを調整すると多少役立ちます。もう1つのオプションは、すべてのエッジ方向を使用してステップ5と6を実行し、diagonal_mapを使用して対角エッジを抽出することです。
- 1. Android用のCannyエッジ検出 - 再帰関数のStackOverflow
- 2. AndroidアプリでOpencv cannyエッジ検出がクラッシュする
- 3. Cannyエッジ検出器の結果を入力してくださいopencv
- 4. OpencvでCanny Edge検出を使用して画像内のテキストを認識
- 5. opencvでエッジ検出を使用して色を変更する
- 6. C++でのOpenCVのCanny Edge検出
- 7. 壊れた画像エッジcannyオペレータ
- 8. MATLABのCanny演算子行列:実装する/取得する方法は? (フィルタのみ、エッジ検出器なし)
- 9. spark(louvain)のウェイトを使用したエッジでのコミュニティ検出
- 10. CIImageを使用した「内部」(エッジのような)検出?
- 11. イメージマップのエッジ検出
- 12. ある程度/角度のテーブルのコーナー
- 13. iPhoneでマスクを使用したエッジ検出
- 14. マップコンテナの緯度と経度のエッジを検出する方法は?
- 15. matlab normxcorr2を使ったエッジ検出
- 16. エッジ検出iphone opencv
- 17. エッジ検出手法
- 18. メソッドedge.eachを使用しているエラー|エッジ|
- 19. Kinectを使用して角度を検出する
- 20. OpenCVでのエッジ検出
- 21. C#でのエッジ検出
- 22. 低解像度/ぼやけた映像のOpenCVのCannyエッジ検出を最適化するにはどうすればいいですか?
- 23. canny segmentationはリンクされていないエッジを生成します
- 24. opencv cannyで雑音/検出ネットを削除する
- 25. グラフの相互エッジを検出する
- 26. UIVIEWのエッジでタッチを検出する
- 27. 検出エッジ(接続エッジ)およびエッジ長さ及び旋回
- 28. 1次元エッジ検出
- 29. MATLAB:片方向エッジ検出
- 30. Android - モバイルでエッジ検出
また、画像を回転することもできます。 :P –
あなたは* "Roberts cross" * convolutionを探していると思います - https://en.wikipedia.org/wiki/Roberts_cross –
私は同様の質問に答えましたhttp://stackoverflow.com/questions/41020357/orientational-canny-edge-detection/41291720#41291720 – Cecilia