eSOL Marketing Official Blog

「基礎から学ぶ医療・科学分野で活用される、OpenCVによる画像認識技術」第3回ハフ変換を用いた直線検出の仕組みについて実例を用いて解説

2025/05/15 10:19:59
こんにちは、イーソルエンジニアリング本部Medical課のS.Yです。

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

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

第2回では、Canny法によるエッジ検出について紹介しました。
第3回では、第1、2回に引き続き第4回以降の基礎となる下記技術の内、「直線検出」について取り上げます。
  • 画像の「回転」、「合成」、「ノイズ除去」 
  • テンプレート画像と同じパターンを検出する「テンプレートマッチング」 
  • 画像に写る物体を識別し、位置を特定する「物体検出」 
  • 画像に写る物体の輪郭を抽出する「エッジ検出」 
  • 画像に写る直線を検出する「直線検出」 

計6回に分けて投稿予定ですので、ぜひ最後までご覧ください。

  • 第4回 セグメンテーション
  • 第5回 タイリング
  • 第6回 焦点合成
目次

 

1. 直線検出とは

直線検出は、その名の通り、画像中の直線を検出する手法です。
第2回でご紹介したエッジ検出により画像中のエッジを抽出した上で、エッジの中から直線のみを抽出します。
図3-1-1はカレンダーの画像に対してエッジ検出と直線検出を行った例です。
直線検出結果は、エッジ検出結果からさらに直線部分のみが抽出され、カレンダーの罫線のみが検出されているのが分かります。
画像中の直線を検出することで、例えば観察プレートのグリッド線などを認識できるため、セグメンテーション等への応用が可能です。
医療分野においては、CTやMRI画像から血管等の特徴的な形状を認識するために用いられています。

250515_1

図3-1-1 直線検出の例

 

2. 直線検出の仕組み(ハフ変換)

直線検出に用いられるアルゴリズムには、ハフ変換やLine Segment Detectorなどがありますが、
今回の勉強会ではハフ変換を使用しました。
直線検出の仕組みの理解のために、実際にハフ変換のアルゴリズムを実装しましたので、簡単な直線の画像に対して適用した結果とともにご紹介します。

    1. 画像の2値化(白黒画像化)

      ハフ変換は、画像中の点を多く通過する直線を探すアルゴリズムです。
      このアルゴリズムを適用するために、まずは画像を2値化(白黒画像化)します。
      画像から検出する直線の候補となる画素、例えば画像中の物体の輪郭などを白、それ以外の背景を黒に分けることで、検出対象を絞ります。
      この2値化のために、一般的にはエッジ検出が行われます。
      図3-2-1は、2本の直線のみの画像に対してエッジ検出を行った結果です。
      直線がエッジとして検出され、2値化した画像が得られました。

      250515_2

      図3-2-1 2本の直線の画像に対するエッジ検出結果

       

    2. 直線方程式で画像中の点を通る直線を表現 

      ハフ変換では以下の直線方程式が用いられます。
      xcosθ+ysinθ=ρ

      直線方程式と言えば、y=ax+bが一般的ですが、この方程式ではy軸に平行な直線を扱いづらいのが難点です。
      上式は、原点から直線への垂線とx軸の成す角θと、原点から直線までの距離ρの組み合わせにより、すべての直線を表すことができます。

      250515_3

      図3-2-2 直線方程式の各パラメータ

      ある座標(a, b)を通る直線は、上記直線方程式から、
      acosθ+bsinθ=ρ
      で表すことができます。
      この式を使って、例えばθ=-90°~90°を代入してρを計算すれば、座標(a, b)を通る直線のρ値をすべて網羅することができます。


    3. (ρ, θ)の組み合わせに対する投票

      2.の直線方程式により、1本の直線と(ρ, θ)の組み合わせが対応します。
      そのため、画像中のすべての点で、通過する直線の(ρ, θ)をすべて調べて投票していくと、票数が多い(ρ, θ)が画像中の点を多く通過する直線を表します。
      図3-2-1でエッジ検出により作成した2値化画像に対して、ハフ変換を適用して得られたρ-θマップが図3-2-3です。
      (ρ, θ)への投票数が白黒のグラデーションで表現されており、投票数が多いほど白く表示されています。
      元画像の2本の直線に対応する2つの白い点が得られています。

      250515_4

      図3-2-3 ハフ変換ρ-θマップ

    4. (ρ, θ)に対応する直線を描く

      ρ-θマップで得られた(ρ, θ)に対応する直線が、検出された直線です。
      どの程度の投票数から「検出された」と判定するかの基準として、しきい値が必要になります。
      図3-2-3のρ-θマップに対して、しきい値を500として、しきい値以下をすべて0としたところ図3-2-4のようになりました。

      250515_5

      図3-2-4 ハフ変換ρ-θマップにしきい値500を適用した結果


      最終的に抽出された(ρ, θ)に対応する直線(赤線)を描くと、図3-2-5の右図のようになりました。
      ここでは単純に画像の端まで直線を引いたため、エッジ検出結果と比較して直線が延長されていますが、画像中の直線の位置や角度が検出できているのが分かります。

      250515_6

      図3-2-5 ハフ変換による直線検出結果


3.OpenCVを使った直線検出の実装

OpenCVでは、Cv2.HoughLinesメソッドやCv2.HoughLinesPメソッドにより直線検出が可能です。
Cv2.HoughLinesは通常のハフ変換、Cv2.HoughLinesPは確率的ハフ変換を使います。
この章ではまずCv2.HoughLinesを使って直線検出を実装した例をご紹介し、4章でCv2.HoughLinesPを使った例をご紹介します。

Cv2.HoughLinesでは、対象となる画像とρ、θの精度、投票数に対するしきい値を指定することで、(ρ, θ)の配列を取得できます。
実際にCv2.HoughLinesで取得した(ρ, θ)に対応する直線を描くプログラムを実装しました。
図3-3-1は、ρの精度を1、θの精度を1radian、しきい値を160に設定して直線検出を実施した結果です。
元画像には横断歩道と歩行者の画像を使用し、エッジ検出後に直線検出を行いました。

250515_7

図3-3-1 Cv2.HoughLinesによる直線検出結果


エッジ検出結果と直線検出結果を重ねると図3-3-2のようになります。

250515_8図3-3-2 元画像と直線検出結果のオーバーラップ


ハフ変換の特徴として、途中で途切れている直線でも検出できる点が挙げられます。
これは、ハフ変換の原理上、点が隣り合っているかどうかは投票結果に影響しないためです。
今回使用した画像では歩行者の足で横断歩道の白線が一部隠されていますが、図3-3-2を見ると直線として検出されているのが分かります。
また、エッジ検出により途切れている直線も、同様に検出できています。
一方で図3-3-3に示したように、画像左上や右上にある短い直線は検出できていません。

250515_9

図3-3-3 検出できない直線


これは、直線が短いと投票数が少なくなり、しきい値を超えられなくなるためです。
もちろんしきい値を下げることで短い直線も検出できるようになりますが、その分ノイズを誤検出しやすくなるため、ノイズをひっかけずに検出できる直線の短さには限度があります。


4.確率的ハフ変換による線分検出

通常のハフ変換の問題点として、大量の計算を必要とする点があげられます。
確率的ハフ変換は通常のハフ変換のように画像中のすべての点で計算を行うのではなく、直線検出をするのに十分な点を画像中からランダムに選択して計算することで、処理の高速化を図った手法です。
OpenCVのCv2.HoughLinesPでは、通常のハフ変換と違い、画像中の線分を検出できるのも特徴です。
Cv2.HoughLinesと同じパラメータに加えて、検出する線分の最小長さ(minLineLength)と、2つの点を1つの線分とみなす最大のギャップ(maxLineGap)を引数に指定することで、画像中から検出された線分の両端の座標が取得できます。
線分の最小長さは、それよりも短い点の並びを線分として検出しない基準値であり、最大ギャップは、2点間の距離がその値よりも離れると同じ線分上の点として検出しない基準値です(図3-4-1参照)。

250515_10

図3-4-1 確率的ハフ変換による線分検出のパラメータ


実際にCv2.HoughLinesPで取得した線分を描くプログラムを実装しました。
図3-4-2は、ρの精度を1、θの精度を1radian、しきい値を120、線分の最小長さを100、最大ギャップを20に設定して線分検出を実施した結果です。元画像には図3-3-1のエッジ検出後の画像を使用しています。
線分検出のため、歩行者の足で横断歩道が隠されている箇所は2つの線分として検出されています。
また、Cv2.HoughLinesでは検出できなかった画像右上の短い線も検出できています。

250515_11

250515_12

図3-4-2 Cv2.HoughLinesPによる線分検出結果


続いて、線分の最小長さと最大ギャップの設定値を変えて、線分検出結果がどのように変わるのか比較してみました。
図3-4-3は、線分の最小長さをminLineLength = 10, 100, 200で変えたときの線分検出結果の比較です。
線分の最小長さの値を大きくしていくと、画像中の短い線分が検出されなくなっていくため、検出される線分の数が減少します。
minLineLength = 10とminLineLength = 200の画像を比較すると、歩行者の足で遮られている線の一部や画像右上の短い線が検出されなくなっているのがわかります。

250515_13

図3-4-3 minLineLength(線分の最小長さ)のみ変えたときの線分検出結果比較


図3-4-4は、最大ギャップをmaxLineGap = 5, 20, 50で変えたときの線分検出結果の比較です。
最大ギャップは、画像中の2点間の距離がこのギャップ以上に離れている場合に同じ線分と判定しないという基準です。
そのため、この値を小さくしていくと線分として検出する基準が厳しくなり、検出される線分の量が減少します。
maxLineGap = 50の画像では、歩行者の足で遮られていて2点間のギャップが大きな箇所も、一つの線分として検出しています。
また、maxLineGap = 5の画像では、画像左から2本目の線が2つの線分に分かれていたり、全体的に検出量が減少しているのがわかります。

250515_14

図3-4-4 maxLineGap(最大ギャップ)のみ変えたときの線分検出結果比較


以上の結果から、Cv2.HoughLinesPで設定できる各パラメータの性質を確認できました。
また、Cv2.HoughLinesP を使うことにより、Cv2.HoughLinesでは検出できなかった短い線の検出が可能であることがわかりました。
Cv2.HoughLinesPでは、線分の最小長さや最大ギャップによる足切りである程度ノイズが除去されるため、Cv2.HoughLinesと比べて短い線の検出ができたと考えられます。
Cv2.HoughLinesでは(ρ, θ)の組み合わせから直線の方程式を計算する必要があるのに対して、Cv2.HoughLinesPでは線分の両端の座標が取得できるため実装もしやすく、基本的には上位互換と考えて良いと思います。

一方で、しきい値と線分の最小長さ、最大ギャップの3つのパラメータを画像に合わせて設定しないと、画像中の線分をうまく検出できなかったり、逆に想定外の箇所が線分として検出されてしまったりするので注意が必要です。
線分の最小長さは長め、最大ギャップは小さめに最初は設定し、検出したい線を検出しつつノイズを誤検出しないラインを探しながら設定値を調整していくと良いです。
しきい値については、ハフ変換の投票数に対するしきい値のため、検出したい線がどれくらい多くの点から構成されているかに依存します。
線分検出を行う前のエッジ検出の段階でいかに検出したい線を明瞭に抽出できているか、ノイズを除去できているかによって、適切なしきい値が変わるので、エッジ検出のパラメータと合わせて総合的に調整する必要があります。

 

5.最後に

第3回ではHough変換による直線検出がどういったものか、実際に実装して適用した結果と共にご紹介しました。
OpenCVには通常のハフ変換による直線検出を行うメソッドと確率的ハフ変換による線分検出を行うメソッドの2種類があったため、両者を実装してみて、実際に横断歩道が写る画像の直線検出を行いました。
その結果、確率的ハフ変換では、通常のハフ変換と比べて短い線の検出が可能であることが分かりました。
また、通常のハフ変換では(ρ, θ)の組み合わせから直線の方程式を計算する必要があるのに対して、確率的ハフ変換では線分の両端の座標が取得できるため、実装面でも扱いやすいということが分かりました。

次回の第4回では「セグメンテーション」について取り上げます。
セグメンテーションとは、画像に写るオブジェクトを識別して分類分けする画像認識技術です。
第2、3回でご紹介したエッジ検出や直線検出を応用して画像中のオブジェクトを識別し、オブジェクト毎に別の画像に分けたりすることができます。
次回もぜひご覧ください。

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

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

 

 

Medical課 S.Y

最近の記事

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