Pythonによるデータ分析・機械学習ブログ

Pythonによるデータの前処理・グラフ化、機械学習、統計解析、画像処理、Webスクレイピング、自然言語処理の基礎について紹介していきます。

MENU

【第16回】OpenCVを用いた直線の検知

はじめに

 OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

上記の機能以外にも、直線を検知する関数が用意されています。

本記事では、OpenCVを用いて直線を検知する方法の一例を簡単に紹介します。今回は検知しやすいように簡単な図形の画像を用います。実際にはガウシアンフィルタで平滑化処理してノイズを除去したり、モルフォロジー処理で線を強調したりといった処理が必要になると思います。

SAMURAI TERAKOYA

 

1. 使用する画像

今回はPoewr Pointで作成した以下の画像を用います。

2. 画像の読み込みとグレースケール化

まずは以下のコードで画像の読み込みと画像のグレースケール化を行います。グレースケール化についてはこちらの記事をご覧ください。

グレースケール化した後の画像は以下になります。

 

3. 画像の白黒反転

続いて、画像の白黒を反転させます。白黒反転にはcv2.bitwise_notを用います。

白黒反転後は以下のようになります。

 

4. エッジ抽出

上図のままでもいいですが、そのほかの画像での発展性も含めてここではCanny処理でエッジ抽出を行います。以下のコードでエッジ抽出を行います。エッジ抽出についてはこちらの記事をご覧ください。

エッジ抽出後は下図のようになります。

 

5. 直線検出

それでは今回の目的である直線の検出を行います。直線の検出はハフ変換(cv2.HoughLinesP)を用います。cv2.HoughLinesPの引数には以下の内容があり、この引数の内容によって結果が大きく変わるので、試行錯誤が必要です。

  • rho:直角座標点と直線の距離(基本はデフォルト値の1でOK)
  • theta:直角座標点と直線の角度(基本はデフォルト値のnp.pi/360OK)
  • threshold:直線とみなすための閾値(直線上にある点の数がこの値以上となった時に直線として扱います)
  • minLineLength:直線とみなす最小の長さ(まずは小さい値から設定して、徐々に上げていってちょうどよい塩梅の値を探索してください。大きすぎると短い直線は検出されず、小さすぎると余分な線まで検出されてしまいます。)
  • maxLineGap:同一直線とみなす点間隔の長さ(値が小さすぎると、複数の個々の直線が1つの直線として扱われる可能性があります。)

さて、それでは直線検知を行って、元の画像に検知した直線を描画してみましょう。直線の描画についてはこちらの記事をご覧ください。

 

検知した直線を描画した画像は下図のようになります。直線が検知されていますが、今回矢印の一部で直線検知がされませんでした。minLineLength=50としていたためにこの現象が起きています。こういったことがあるので、引数の値の調整をご自身で行ってみてください。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、OpenCVを用いて直線を検知する方法の一例を簡単に紹介しました。今回は簡単な図形に対して直線検知を行いましたが、実際にはガウシアンフィルタで平滑化処理してノイズを除去したり、モルフォロジー処理で線を強調したりといった処理が必要になると思います。