eSOL Marketing Official Blog

「基礎から学ぶ医療・科学分野で活用される、OpenCVによる画像認識技術」第2回 Canny法によるエッジ検出の仕組みについて実例を用いて解説

2025/03/13 16:00:00

こんにちは、イーソルエンジニアリング本部Medical課のS.Yです。

Medical課では、医療機器や研究向け製品をはじめとした医療・科学分野のエンジニアリングサービスを提供しています。

このブログシリーズでは、医療や科学分野において活用される画像認識技術や、それに付随する基礎的な画像処理技術について学ぶ社内勉強会において私が得た知見についてご紹介しています。
 

第1回では、画像認識技術の概要とテンプレートマッチングについて紹介しました。
第2回では、第1回に引き続き基礎となる下記技術の内、「エッジ検出」について取り上げます。

  • 画像の「回転」、「合成」、「ノイズ除去」 
  • テンプレート画像と同じパターンを検出する「テンプレートマッチング」
  • 画像に写る物体を識別し、位置を特定する「物体検出」
  • 画像に写る物体の輪郭を抽出する「エッジ検出」
  • 画像に写る直線を検出する「直線検出」 

前回は「直線検出」も取り上げると予告していましたが、エッジ検出だけで分量が多くなったため、直線検出は次回取り上げることにします。
そのため、計5回から6回に増やして投稿予定です。ぜひ最後までご覧ください。

  • 第3回 直線検出
  • 第4回 セグメンテーション
  • 第5回 タイリング
  • 第6回 焦点合成

 


目次

 

1. エッジ検出とは

画像中の明暗が分かれる部分、つまり、隣り合うピクセルの色情報(画素値)に大きく差がある箇所をエッジとして検出する手法を「エッジ検出」と呼びます。
図2-1-1は横断歩道の画像に対してエッジ検出を行った例です。
元画像から「エッジ」として判定された箇所のみが白くなっています。

図2-1-1 エッジ検出の例

図2-1-1 エッジ検出の例

エッジ検出により物体の輪郭や何らかの境界を抽出することで、画像中に写る物体や直線の検出に応用することができます。

人間の目は画像に写る物体とそれ以外の背景を識別することができますが、コンピュータにとって画像は色情報を数値でもつピクセルの集合体でしかないため、この色情報や隣り合うピクセルとの違いなどからその画像の特徴を分析するしかありません。
テンプレートマッチングは、分析したい画像とは別にテンプレート画像を用意し、両者の色情報を比較することで類似している領域を探索する手法でした。
一方でエッジ検出は、分析対象画像のみの色情報だけで検出を行うため、テンプレートマッチングのような事前準備なしで分析可能であることが特長の一つです。

2. エッジ検出の仕組み(Canny法)

エッジ検出には、ソーベルフィルタ、プレヴィットフィルタ、ロバーツフィルタ、ラプラシアンフィルタなど、様々なエッジ検出フィルタが用いられますが、今回の勉強会ではソーベルフィルタを用いる「Canny法」を使用したため、ここではCanny法について簡単にご紹介します。

    1. 画素値の勾配を求める

      画素値が大きく変化する箇所がエッジであるため、まずは画素値を微分して画素値の勾配(画素値の変化量)を求めます。
      図2-2-1はエッジと微分値の関係を極端な図で示したものです。
      一番上の白黒画像に対して赤い線上の画素値をプロットすると、真ん中に示したような画素値の分布となります。
      この画素値を微分すると一番下のグラフのようになり、画像におけるエッジの位置に鋭いピークが得られることがわかります。

      図2-2-1 エッジと画素値、微分値の関係

      図2-2-1 エッジと画素値、微分値の関係

      一つの画素は縦方向と横方向の二つの方向に隣り合う画素があるため、画素値の勾配は縦横両方向で計算でき、この結果から勾配の「大きさ」と「方向」が分かります。
      例として、図2-2-2に示した位置の画素値の勾配を考えてみます。


      図2-2-2 画素値の勾配のイメージ

      図2-2-2 画素値の勾配のイメージ

      縦方向と横方向の微分値をそれぞれ青矢印と赤矢印の長さで表現しています。
      この場合、図2-2-2に示した黒い矢印の長さが勾配の「大きさ」、方向が勾配の「方向」です。
      つまり、縦方向と横方向の微分値の二乗和平方根から勾配の「大きさ」、縦方向と横方向の微分値の比から勾配の「方向」を求めることができます。
      Canny法ではこの工程をソーベルフィルタという画素値を微分値に変換するフィルタを使って実現しています。

    2. 勾配方向の直線上で勾配の大きさが最大となる位置を見つける

      1で求めた勾配の方向に見ていったときに、勾配の大きさが最大となる位置が「エッジ」の候補です。
      図2-2-3の例では、黒い矢印に沿って見ていったときに勾配が最大となる赤い点の位置が「エッジ」の候補として抽出されます。

      図2-2-3 勾配方向の直線上で勾配が最大となる位置

      図2-2-3 勾配方向の直線上で勾配が最大となる位置

    3. しきい値を使ってエッジを決定する

      最後に2で抽出したエッジの候補のうちから、しきい値を使って正しいエッジとそうでないものを区別します。
      Canny法では最大しきい値と最小しきい値の2つを使っており、1で求めた勾配の大きさが最大しきい値以上であれば正しいエッジ、最小しきい値以下であればエッジではないと判断します。
      勾配の大きさが最小しきい値と最大しきい値の間の場合は、正しいエッジと隣接するもののみを正しいエッジと判定します。
      以上の流れで画像中のエッジを検出することができます。

3.エッジ検出の実装

勉強会では、OpenCVのCv2.Cannyメソッドを使ってエッジ検出を実装しました。
このメソッドでは、対象となる画像と最小・最大しきい値を指定することで、エッジ部分を白、それ以外を黒に変換した画像データを取得できます。
このしきい値は、前の章で登場した、正しいエッジとそうでないエッジを判別するためのしきい値です。
実際にエッジ検出を行うプログラムを実装し、微細藻類の画像(図2-3-1)に適用してみました。
ということがわかりました。 

図2-3-1 エッジ検出を行う元画像

図2-3-1 エッジ検出を行う元画像


エッジ検出のしきい値をどこに設定するか決定するために、まずは図2-3-1の画像にソーベルフィルタをかけて、微分値がどの程度の値になるか調べました。
特定のライン上での画素値やソーベルフィルタによる微分値をグラフにしたものが図2-3-2です。
まずは元画像をグレースケール化し、画像中に見られている4つの藻類を通るように図2-3-2の1列目に示したように3パターンの赤いラインを引きました。
そのライン上の画素値と微分値のグラフが図2-3-2の2列目と3列目です。

図2-3-2 特定のライン上での画素値とソーベルフィルタによる微分値図2-3-2 特定のライン上での画素値とソーベルフィルタによる微分値


画素値の微分により、藻類の輪郭部分がピークとなって強調されているのがわかります。
エッジ検出のしきい値は、エッジとして検出したい部分とそうでない部分の微分値を見て設定します。
今回の例であれば、画像中に写っている4つの藻類それぞれの検出(物体検出)やセグメンテーションへの応用を考えると、エッジ検出により輪郭のみが検出されるのが望ましいと思われます。
そのため、4つの藻類の輪郭部分の微分値よりも下に最大しきい値を設定し、輪郭以外の部分の微分値の大部分が最小しきい値未満になるよう、図2-3-3のように(最小しきい値、最大しきい値)=(260、300)に設定してエッジ検出を行いました。

図2-3-3 最小しきい値と最大しきい値の設定例

図2-3-3 最小しきい値と最大しきい値の設定例


エッジ検出の結果図2-3-4の画像が得られました。

図2-3-4 エッジ検出結果(最小しきい値 = 260、最大しきい値 = 300)

図2-3-4 エッジ検出結果(最小しきい値 = 260、最大しきい値 = 300)


円形の藻類の輪郭部分だけでなく、内側の模様なども一部エッジとして検出されました。
最大しきい値は、図2-3-3を見る限りこれ以上上げられないので、続いて最小しきい値を最大しきい値ぎりぎりまで上げてみました。
(最小しきい値、最大しきい値)=(299、300)に設定してエッジ検出を行った結果が図2-3-5です。

図2-3-5 エッジ検出結果(最小しきい値 = 299、最大しきい値 = 300)

図2-3-5 エッジ検出結果(最小しきい値 = 299、最大しきい値 = 300)


エッジとして検出される内側の模様が少し減りましたが、まだまだ輪郭部分以外が多く検出されてしまっています。
輪郭と内側の模様は微分値が近く、しきい値だけでは分離できないことがわかりました。
次の章では、画像中のノイズを除去することにより、エッジ検出で藻類の輪郭部分のみを検出できるようにならないか検証した結果をご紹介します。


4.ノイズ除去によるエッジ検出精度の向上

元画像そのままでは、エッジ検出により画像中の藻類の輪郭のみを抽出することができなかったため、画像にフィルタをかけてノイズを除去できないか検証しました。
ここで「ノイズ」としているのは、今回エッジ検出で検出したくない、輪郭以外の画素値の変化です。
極端なイメージではありますが、図2-2-1のように輪郭以外は平坦で画素値の変化がないのが理想です。

ノイズを除去するフィルタにはいくつか種類がありますが、輪郭をなるべくぼやかさずに輪郭以外を平滑化するためには、メディアンフィルタが用いられます。
メディアンフィルタは、各画素に対してカーネルと呼ばれる決められた画素領域を定め、画素値をその領域内の中央値に書き換えるフィルタです。
カーネルサイズ = 3の場合の例を図2-4-1に示します。
この例では3×3の領域での中央値が160なので、中央の画素値が160に書き換えられます。

図2-4-1 カーネルサイズ = 3の場合のメディアンフィルタの例

図2-4-1 カーネルサイズ = 3の場合のメディアンフィルタの例


OpenCVでは、Cv2.MedianBlurメソッドを使って、メディアンフィルタを実装することができます。
実際に図2-3-1の画像をグレースケール化し、メディアンフィルタを適用した結果が図2-4-2です。
左からフィルタなし、カーネルサイズ = 5の場合、カーネルサイズ = 11の場合の画像と画素値、微分値を並べています。

図2-4-2 Medianフィルタによる画素値、微分値の変化

図2-4-2 Medianフィルタによる画素値、微分値の変化


メディアンフィルタをかけ、カーネルサイズを大きくしていくことで、輪郭以外の領域の微分値が輪郭部分に比べて目立たなくなっているのが分かります。

カーネルサイズ = 11にしてメディアンフィルタをかけることでノイズをかなり軽減できたため、この状態でエッジ検出を実施してみました。
(最小しきい値、最大しきい値)=(70、150)に設定してエッジ検出を行った結果が図2-4-3です。
メディアンフィルタをかけてノイズを除去したことにより、エッジ検出で画像中の藻類の輪郭のみを抽出することができました。

図2-4-3 ノイズ除去後のエッジ検出結果

図2-4-3 ノイズ除去後のエッジ検出結果


以上のように、実際にエッジ検出を活用していくためには、事前に画像中のノイズを除去する前処理が必要です。
今回は1枚の画像について、メディアンフィルタのカーネルサイズやエッジ検出のしきい値を設定しました。
エッジ検出をより実用的に使っていくためには、これらのパラメータを自動的に決定できるような仕組みを作ることが課題になります。


5.最後に

第2回ではCanny法によるエッジ検出がどういったものか、実際に実装して適用した結果と共にご紹介しました。
エッジ検出を適用する際には、セグメンテーション等への応用を考えて、輪郭のみの抽出を目指して画像の分析やしきい値調整を行いました。
結果として、今回使用したような画像の輪郭抽出には、ノイズを除去する前処理が必須であることが分かりました。
エッジ検出を実用的に使っていくためには、前処理のパラメータやエッジ検出のしきい値を自動的に決定できるような仕組みが必要となります。

前回予告していて今回ご紹介できなかった「直線検出」については、第3回で取り上げます。
直線検出は、エッジ検出の後にエッジの中から直線を抽出する手法です。
画像中の直線を検出することで、観察プレートのグリッドや枠等を認識して分割するセグメンテーションへの応用が可能です。
次回もぜひご覧ください。

また冒頭でご紹介した通り、イーソルは医療分野のエンジニアリングサービスを提供しており、豊富な実績があります。
医療分野のみならず、車載・産業などの幅広い領域における開発実績で身に着けた安全性の高い開発プロセスなどの知見や技術力は、お客様の求めるお客様が目指す高性能で高品質な開発を強力に支援します。

医療分野の製品開発で課題がある、今回ご紹介したような画像認識技術に関わる開発を実施したい、エンジニアリングサービスについて詳しく知りたい、という方はぜひお気軽にイーソルにご相談ください。


医療ソフトウェア 開発実績資料ダウンロード

オンライン無料相談はこちら


Medical課 S.Y

最近の記事

ブログの更新通知を受け取る