画像・音声処理

エッジ検出を完全理解!主要3フィルタとCanny法の実装手順を解説

画像処理を学び始めた方のなかには、下記のような疑問がある方も多いのではないでしょうか。

  • エッジ検出って何?
  • エッジ検出ってどうやって実装するの?

今回は、エッジ検出の仕組みや近年の活用例、主要フィルタを解説します。また、Canny法をOpenCVで実装する方法の解説を通じて、エッジ検出の正しい実装方法も理解できます。

エッジ検出の理論も実装もマスターしたい方は、ぜひ最後までご覧くださいね!


本ブログを運営しているTech Teacherは、
プログラミング家庭教師サービスを運営しています。
完全マンツーマン・フルオーダーメイド
あなたが必要な指導を提供します。

エッジ検出とは

エッジ検出とは、画像内の輝度差を検出する技術のことです。エッジ検出のエッジとは単純に「端」を意味するのではなく、白背景の黒文字で見られるような「明暗が分かれる部分」を指します。

エッジ検出で用いるデジタル画像は、ピクセルごとに輝度の数値情報を持っているため、それぞれの輝度値によって物体と背景や物体間を分離できるのです。

元画像からエッジを抽出した画像へ変換する際には、「畳み込み演算」を行います。具体的には、エッジを検出する中心ピクセルと上下・左右・斜め方向にある周辺ピクセルに、フィルタを乗算します。乗算後にそれぞれを合算した値が、変換後の中心ピクセルです。

フィルタの多くが縦・横方向の2つに分かれており、中心ピクセルに対して縦・横方向の輝度差を別々に検出して、最後に合算して1枚の画像にします。

またフィルタは、3×3の正方行列が一般的です。例えば、最もシンプルな1次微分フィルタの行列は、下記のとおりです。

引用:1次微分フィルタ Prewitt(プレヴィット)フィルタ/ミブログ

エッジ検出のフィルタの重みは、微分の原理に基づいています。例えば、1次微分フィルタの横方向のフィルタでは、中心ピクセルと右隣のピクセルとの勾配を求めることになります。エッジ検出は、ピクセル間の輝度値の微分により勾配を求める仕組みといえるのです。

下記の図のように、ピクセル間の輝度の差はシグモイド関数のように示せるので、フィルタを畳み込む際はシグモイド関数に対して微分をするイメージを持つとよいですよ!

引用:【画像処理基礎】ノイズを除去しつつエッジを抽出するソーベルフィルタ/CRAFT GoGo

以上より、エッジ検出は微分の原理を利用して近傍のピクセル間の勾配を計算し、画像内の輪郭線を抽出できる技術と覚えておくとよいでしょう。

なお、畳み込み演算は機械学習のCNNでも使われる技術です。畳み込み演算については、下記で図を使って詳しく解説しているので、チェックしてみてくださいね!

機械学習CNNを理解する!初学者が押さえておきたいポイントを解説機械学習の学習者向けにCNNについて解説します。Pythonでの実装を視野に モデル内で何を行っているか、畳み込みとはどういうことなのかなど 実際の計算も踏まえわかりやすく解説していきます。...

近年の活用例

エッジ検出は優れた画像処理技術として、これまでにさまざまな分野で研究・応用されてきました。例えば、下記のように対象物の輪郭や位置、高さを検出する必要があるケースで活用されています。

  • 自動運転のための白線・レール検出
  • 工場ラインの寸法検査
  • 医療画像内の血管や臓器の輪郭検出
  • 機械学習で使う画像や動画の前処理

古典的なエッジ検出技術は、医療画像用の検出ソフトや機械学習の前処理で適用されています。また近年では、エッジ検出用の新しいアルゴリズムの開発が進められており、機械学習と組み合わせて自動運転やスマートファクトリーをはじめとする最新分野での活用が期待されています。

主要フィルタの特徴

エッジ検出のフィルタにはさまざまなものが存在し、フィルタによって輝度差の検出度合いが異なってきます。ここでは、エッジ検出でよく使われる下記の3つのフィルタを紹介します。

  • ガウシアンフィルタ
  • ソーベルフィルタ
  • ラプラシアンフィルタ

    それぞれの特徴やメリット・デメリットを解説するので、フィルタを選ぶ際の参考にしてくださいね!

    ガウシアンフィルタ

    ガウシアンフィルタとはガウス分布に従ってフィルタ内の重みを決定するフィルタです。ガウス関数のイメージのように、中心ピクセルが最も大きい重みで、中心から離れるほど重みが小さくなります。下記がガウシアンフィルタです。

    引用:ガウシアンフィルタ – 画像処理におけるノイズの除去/ミブログ

    ガウシアンフィルタの特徴は、中心ピクセルからの距離に応じて重みづけをするため、周辺ピクセルの影響を受けにくい点です。そのため、元画像が持つ輪郭線を大きく崩すことなく、ノイズの影響を軽減できるメリットがあります。

    一方でエッジが中心ピクセルに対して右角などの離れた距離にある場合には、ほかのピクセルと同じように平均化されてしまい、うまく検出されない点に注意が必要です。

    ガウシアンフィルタは平滑化フィルタと呼ばれ、ピクセル間の輝度差をなくしたい場合やノイズをぼかしたい場合に使われます

    ソーベルフィルタ

    ソーベルフィルタとは、上下・左右に隣接するピクセルのエッジを強調できる1次微分フィルタです。下記がソーベルフィルタの行列です。

    引用:1次微分フィルタ ソーベルフィルタ (Sobelフィルタ)- 画像のエッジ検出/ミブログ

    上記の図より、ソーベルフィルタでは横方向では中心ピクセルに対して左右に隣接するピクセルの輝度値、縦方向では上下に隣接するピクセルの輝度値を2倍するようになっていることがわかります。

    そのため、ほかのフィルタと比べて、隣接するピクセル間でコントラストの小さいエッジでも強調できるメリットがあります。一方で、ノイズも過度に検出されてしまうデメリットがあります。

    エッジに対して敏感に反応可能なソーベルフィルタは、輪郭線の「見逃し」を軽減できるため、エッジ検出用のフィルタとして頻繁に使用されています。

    ラプラシアンフィルタ

    ラプラシアンフィルタとは、中心ピクセルと隣接するピクセルとの輝度差を強調できる2次微分フィルタです。4近傍と8近傍の2種類のラプラシアンフィルタがあり、下記がそれぞれの行列です。

    引用:2次微分フィルタ ラプラシアンフィルタ(Laplacianフィルタ) – 画像のエッジ検出/ミブログ

    4近傍の場合には上下左右方向の輝度差のみですが、8近傍では斜め方向の輝度差も考慮されます。そのため、8近傍では全方向のエッジを抽出できるため、4近傍と比較して輪郭線が強調された変換画像が得られます

    輪郭の検出精度が高いことから、8近傍のラプラシアンフィルタの方が利用される頻度が高いです。

    ラプラシアンフィルタは、エッジを強調する「鮮鋭化」の処理で活用されます。

    エッジ検出のCannyアルゴリズムを実装する方法

    エッジ検出にはさまざまなアルゴリズムが存在しますが、なかでも「Cannyアルゴリズム」は押さえておくとよい手法です。ここでは、Cannyアルゴリズムの構築手順を簡単に解説したあとに、OpenCVによる実装コードを紹介します。

    なお、今回はOpenCVのインストール方法や画像の読み込みの説明は行いません。OpenCVのWindows・Linuxへのインストール手順や基本的な使い方がわからない方は、下記を参考にしてくださいね!

    Python + OpenCVで画像処理をマスター!使用法・実用例を解説Python初心者の方でOpenCVの使い方について悩んでいる人必見。OpenCVの基礎知識やインストール方法、使い方を網羅しました。OpenCVを使用した画像動画処理について悩んでいる人は参考にしてください。...

    Cannyアルゴリズムとは

    Cannyアルゴリズムとは、ガウシアンフィルタとソーベルフィルタを組み合わせたエッジ検出の古典的な手法です。具体的には下記の手順でエッジを検出します。

    1. ノイズを除去するためにガウシアンフィルタをかける
    2. 輪郭線を抽出するためにソーベルフィルタをかける
    3. 輝度の勾配の方向と大きさを計算
    4. 細線化を行うために「非極大値抑制処理」をする
    5. 誤検知したエッジを除去するために 「ヒステリシスしきい値処理」をする

    まずガウシアンフィルタをかけて全体的にノイズを取り除いたあと、ソーベルフィルタを使って輪郭線を抽出します。

    ソーベルフィルタでは勾配を計算しただけなので、大まかな輪郭線しか抽出できていません。そこで「非極大値抑制処理」と「ヒステリシスしきい値処理」を行うことで、信頼性の高いエッジを強調し、シャープな輪郭線を抽出します。

    非極大値抑制処理を実行する前に、元画像に対して縦・横それぞれのソーベルフィルタをかけた変換画像から、各ピクセルにおける輝度の勾配の方向と大きさを求めます。勾配の方向と大きさは、次工程でエッジを判別するための材料です。

    非極大値抑制処理は、各ピクセルの勾配が「左〜右横(緑線)・左~右上(青線)・上下(黄色線)・右〜左上(灰色線)」のうち、どの角度に含まれるかを判定する処理です。

    引用:【入門】非極大値抑制【数値計算】/シミュレーションの世界に引きこもる部屋

    具体的には、中心ピクセルと周辺との勾配の大きさを比較するときに、中心ピクセルが最大値となる場合に、「エッジの候補値」として採用します。一方で、中心エッジが最大ではない場合の周辺のピクセル値は、エッジではないとみなし、すべてゼロとします。

    比較の際は、中心ピクセルに対して縦・横・斜めに隣接する3つのピクセルの値を見るのが一般的です。

    非極大値抑制処理により、エッジではないピクセルが削除され、1ピクセル幅の細いエッジを抽出した画像が得られます

    最後に、ヒステリシスしきい値処理を行います。ヒステリシスしきい値処理とは、最大・最小のしきい値を基準にして真のエッジと偽のエッジを判別する処理です。

    具体的には、各ピクセルにおけるエッジの候補値が最大しきい値を超える場合には、「真のエッジ」とみなしてそのまま採用します。一方で、最小しきい値を下回る場合には、「偽のエッジ」として削除します。

    最大・最小しきい値の中間に存在するエッジの候補値に対しては、隣接するピクセルの候補値としきい値との比較を繰り返し、最大しきい値を超える場合に「真のエッジ」に分類します。

    ヒステリシスしきい値処理により、断片的に存在するエッジが連結され、連続したエッジを抽出可能です。

    以上の1〜5の工程により、Cannyアルゴリズムではノイズを除去しつつ、コントラストの弱いエッジを的確に検出できます

    OpenCVによるCannyアルゴリズムの実装コード

    では、OpenCVを使ってCannyアルゴリズムの実装コードを紹介します。今回は、「Lenna」と呼ばれるカラー画像に対してCannyアルゴリズムでエッジを検出するタスクを行います。手元にあるカラー画像で試してみてくださいね!

    実装手順は、下記の4ステップです。

    1. カラー画像の読み込みとグレースケールへの変更
    2. Cannyアルゴリズムのヒステリシスしきい値処理の最大・最小しきい値を手動で決定
    3. Cannyアルゴリズムの実行
    4. 元画像とエッジ検出後の画像を描画

    各コメントは下のコードの内容に対応しているので、実装の参考にしてみてくださいね。

    # ライブラリのインポート
    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    # カラー画像の読み込み
    # 第2引数:グレースケール指定
    gray_org_img = cv2.imread('/Lenna.png',0)
    
    # Cannyアルゴリズム実行
    # 第2引数:ヒステリアスしきい値処理の最小しきい値
    # 第3引数:ヒステリアスしきい値処理の最大しきい値
    canny_edges = cv2.Canny(gray_org_img,100,200)
    
    # 元画像描画
    plt.subplot(121),plt.imshow(gray_org_img,cmap = 'gray')
    plt.title('Original Image'), plt.xticks([]), plt.yticks([])
    
    # エッジ検出後の画像描画
    plt.subplot(122),plt.imshow(canny_edges,cmap = 'gray')
    plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
    
    plt.show()

    下記がグレースケール処理をした元画像とエッジ検出後の画像を描画した結果です!特に、目の周辺や帽子の装飾がしっかりと検出されていることがわかりますね。

    実装コードにあるように、OpenCVでは複雑なCannyアルゴリズムをたった1行で実装可能です。OpenCVにはCannyアルゴリズム以外にも、画像処理を行うための便利なメソッドが豊富なため、画像分野のプログラミングスキルを習得したい方はチェックしてみてくださいね!

    データサイエンスを学習するならTech Teacherで!

    『Tech Teacher』3つの魅力

    魅力1. オーダーメイドのカリキュラ

    『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。

      魅力2. 担当教師によるマンツーマン指導

      Tech Teacherでは完全マンツーマン指導で目標達成までサポートします。
      東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
      そのため、理解できない箇所は何度も分かるまで説明を受けることができます。

      魅力3. 3,960円/30分で必要な分だけ受講

      Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。

      まとめ

      ・魅力1. 担当教師によるマンツーマン指導

      ・魅力2. オーダーメイドのカリキュラム

      ・魅力3. 3,960円/30分で必要な分だけ受講

      質問のみのお問い合わせも受け付けております。

      まとめ

      エッジ検出とは、ピクセルの勾配に注目し、画像内の輪郭を抽出する技術です。エッジ検出は、自動運転や機械学習の前処理など最新技術の開発シーンで活用されています。

      エッジ検出を含む画像処理技術を効率よく身につけたい方には、「Tech Teacher」がおすすめです!Tech Teacherでは、画像認識に熟知した講師からマンツーマンで指導を受けられます。興味がある方は、お気軽に「資料請求・無料体験」をお申し込みください。