Canny edge detection

シェアする

  • このエントリーをはてなブックマークに追加
最近の記事
  • 8/21 【Neural Network Console】Learning Rate(学習率)の設定
  • 8/20 ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール
  • 8/20 Deep Learning
  • 8/20
  • 8/19 古いバージョンのVisual Studio Community/Expressの入手ダウンロード
  • 8/19 CUDAの入手、ダウンロード、インストール方法
  • 8/17 【C#.NET】マイクロソフト仕様のアフィン変換
  • 8/5 【C#】ファイルを開くダイアログボックスの表示
  • 8/2 キャノンプリンターのCDトレイはどこ?!
  • 7/6 【参考書籍】画像処理・機械学習プログラミング OpenCV 3対応
  • 6/20 【Python,matplotlib】動くグラフをAnimationGifに保存する方法
  • 6/17 シグモイド関数の微分
  • 6/15 シグモイド関数
  • 6/13 合成関数の微分
  • 6/12 WordPressで数式エディタ風に数式を入力したい
  • 6/11 PythonをVisual Studioでインストールする方法
  • 6/9 【Python】OpenCVをAnacondaでインストール(Windows編)
  • 6/6 【Python】Anacondaで複数バージョンの環境切り替え
  • 6/6 画像センシング展2017に出展します。
  • 6/1 【Office365】Web版Outlookのフォントサイズ変更
  • 6/1 【Anaconda】モジュールのアップデートでエラー発生
  • 6/1 【Anaconda】コマンドリストの表示
  • 5/29 Windows10パソコン購入
  • 5/24 Anacondaのアンインストール
  • 5/24 【Jupyter Notebook】新規プログラムの作成
  • 5/23 【Python】開発環境の構築
  • 5/23 Pythonはじめました
  • 4/6 【Office365】Web版Outlookのスレッド表示を解除する方法
  • 4/5 【Excel】フーリエ解析(FFT)
  • 3/20 Canny edge detection
  • 3/20 【Excel2016】分析ツールの表示
  • 3/5 【Visual Studio】黒い背景色を白に変更する方法
  • 2/8 【Windows10】拡張モニタに表示されたウィンドウを元に戻す
  • 2/7 複素数の計算
  • 1/18 【Excel】棒グラフの横軸の目盛を0始まりにする
  • 1/16 【Excel】フーリエ変換
  • 1/6 【OpenCV】疑似カラー(カラーマップ)
  • 11/8 【Visual Studio】検索結果のウィンドウ表示
  • 11/3 ニコン 一眼レフカメラ D5500レビュー
  • 10/26 カラーカメラはモノクロカメラを兼ねない
  • 9/6 (Free Soft)Animation GIF Builder
  • 8/30 【C#】タブの無いTabControlっぽいものを作る
  • 8/29 【OpenCvSharp】サンプルプログラムの公開
  • 8/28 【PowerPoint】部分的にカラーにする(セレクトカラー処理)
  • 8/27 【C#】引数の値渡し、参照渡し(ref, out)
  • 8/26 【Word/Excel】図形内に文字を挿入する
  • 8/25 【C#】NumericUpDownコントロール
  • 8/24 ニコン D3400 VS D5500 仕様比較
  • 8/22 【C#】MDIフォームにリサイズ可能なPanelを設置する
  • 8/20 【Visual Studio 2015】文字の色が変、かすむ

  • Canny edge detectionは画像の輪郭部分を抽出するのに、よく用いられるのですが、詳細なアルゴリズムを理解しないまま使われている事も多いのではないでしょうか?(それ、私)

    特に、ヒステリシスしきい値の部分などは、詳細な説明も少ないので、今回、まとめてみたいと思います。

    まずは処理結果から。

    Canny edge detector Canny edge detector
    処理前画像 Canny edge detection処理後

    大まかな流れとしては

    1.ノイズ除去

    ガウシアンフィルタなどでノイズを除去します

    Canny edge detector

    2.輪郭抽出

    ソーベルフィルタで輪郭を抽出します

    Canny edge detector

    3.非極大抑制

    エッジの強さが極大となる部分以外を除外します。

    詳細は後述

    Canny edge detector

    4.ヒステリシスしきい値処理

    詳細は後述

    Canny edge detector

    完成!!

    以上の4ステップで成り立っていますが、非極大抑制とヒステリシスしきい値処理がちょっとわかりづらいので、詳細は以下の通りです。

    非極大抑制

    ソーベルフィルタ後のエッジの強さを3D表示すると、こんな感じ↓になります。

    Canny edge detector

    この山の尾根のみを抽出するのが、非極大抑制となります。

    Canny edge detector Canny edge detector

    具体的には、まず、ソーベルフィルタでエッジの強さを求めて、エッジの角度を求めます。

    横方向

    Canny edge detector

    縦方向

    Canny edge detector

    エッジの強さ

    Canny edge detector

    エッジの角度(実際にはエッジの線に直行する向きが求まります)

    Canny edge detector

    エッジの向き(エッジの法線方向)が求まったら、

    0°(-22.5°~22.5°)

    Canny edge detector

    45°(22.5°~47.5°)

    Canny edge detector

    90°(47.5°~112.5°)

    Canny edge detector

    135°(112.5°~157.5°)

    Canny edge detector

    の4つに分類します。

    エッジの法線方向の3画素のエッジの強さを用いて、中央のエッジの強さが、残す2つの良さよりも大きければ、その部分が極大点ということになり、中央のエッジの強さが最大とならない部分を除外する処理が非極大抑制となります。

    Canny edge detector Canny edge detector
    エッジの強さ 非極大抑制

    この処理によりエッジの部分の細線化が行われます。

    ヒステリシスしきい値処理

    ヒステリシスしきい値の処理については、Webで探してもあまりわかりやすいのが無いような気がしますが、以下の通りです。

    まず、非極大抑制処理で細線化された画像に対して、2つのしきい値を用いて二値化します。

    2つのしきい値は、なんとなくエッジっぽい部分(しきい値「小」)と、確実にエッジな部分(しきい値「大」)となるしきい値を設定します。

    非極大抑制処理画像

    Canny edge detector

    Canny edge detector Canny edge detector
    しきい値「小」 しきい値「大」

    この2つの画像を用いて、しきい値「小」の中から、しきい値「大」につながっている部分のみを残します。

    分かりやすいように、しきい値「小」の画像にしきい値「大」のエッジを赤くして重ね合わせて表示すると↓

    Canny edge detector

    この赤い線につながっていない部分を除外します。

    Canny edge detector

    この処理がまさにCanny edge detectionとなります。

    (参考)

    OpenCV 3.0.0-dev documentation Canny Edge Detection

    画像処理アルゴリズムへ戻る

    コメント