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

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

MENU

【第2回】Opencvを用いた画像のグレースケール化、輝度平滑化、閾値処理、各色成分の取出、HSV色空間変換

はじめに

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

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

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

本記事では、Opencvを用いた画像のグレースケール化、輝度平滑化、閾値処理(二値化)、各色成分の取出、HSV色空間変換に方法について紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像を読み込んで表示するコードを記載します。画像の読込にはcv2.imread()を用います。画像の表示にはcv2.imshow() を用います。cv2.waitkey()で表示する時間を指定することができ、cv2.waitkey(0)とすることでキーボードが押されるまで表示されます。cv2.destroyAllWindows() は現在までに作られた全てのウィンドウを閉じます。

 

2. グレースケール化

グレースケールを行うには読み込み時と、読み込み後に行い方法があります。まずは読み込み時のグレースケール化です。グレースケールで読み込むにはcv2.imread()の引数にcv2.IMREAD_RRAYSCALEを指定します。

出力結果は以下の様になります。

 

次に、読み込み後のグレースケールへの変換について示します。グレースケール化に関わらず色空間(色)の変換にはcv2.cvtColor()関数を用います。RGB色空間からグレースケールへ変換するにはcv2.cvtColor()の引数にcv2.COLOR_RGB2GRAYを指定します。

出力結果は以下の様になります。

 

3. 輝度平滑化

グレースケールで画像を読み込んで輝度を平滑化します。グレースケール画像の画素値が輝度になります。白から黒までの画素値の分布がありますが、それを平滑化して白から黒まで偏りない画素値の画像にします。そのため、白側と黒側の割合が増えてハッキリとした画像になります。輝度の平滑化にはcv2.equalizeHist()関数を用います。コード例は以下の様になります。

 

4. 閾値処理(二値化)(cv2.threshold())

続いて、閾値処理(二値化)について説明いたします。閾値処理ではcv2.threshold(img, num1, num2, thresholdtype)を用います。imgはグレースケールの画像、num1は画素値の閾値、num2は閾値条件を満たした際の最大値、 thresholdtypeは閾値処理の種類となります。

閾値処理の種類は以下の様になります。ここで画像がグレースケールで、画素値が0の場合は黒色、255の場合は白色になります。

閾値処理の種類 処理内容
cv2.THRESH_BINARY 画素値が閾値(num1)以上の場合は最大値(num2)に、閾値以下の場合は0に変更
cv2.THRESH_BINARY_INV 画素値が閾値(num1)以上の場合は0に、閾値以下の場合は最大値(num2)に変更
cv2.THRESH_TRUNC 画素値が閾値(num1)以上の場合は最大値(num2)に変更し、閾値以下の場合は元の画素値のまま
cv2.THRESH_TOZERO 画素値が閾値(num1)以上の場合は元の画素値のままで、閾値以下の場合は0に変更。※ここで最大値num2は意味がありません。
cv2.THRESH_TOZERO_INV 画素値が閾値(num1)以上の場合は0に変更し、閾値以下の場合は元の画素値のまま。※ここで最大値num2は意味がありません。

 

それでは各閾値処理を描いていきます。

【cv2.THRESH_BINARY】

 

【cv2.THRESH_BINARY_INV】

 

【cv2.THRESH_TRUNC】

 

【cv2.THRESH_TOZERO】

 

【cv2.THRESH_TOZERO_INV】

 

5. 適応的閾値処理(cv2.adaptiveThreshold())

続いて、適応的閾値処理について説明いたします。適応的閾値処理では、cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)を用います。srcはグレースケールの画像、maxValueは閾値を満たした際の最大値、adaptiveMethodは閾値の計算方法、thresholdTypeは閾値処理の種類、blockSizeは閾値計算に利用する近傍領域サイズ、Cは計算された閾値から引く値になります。

閾値の計算方法は2種類あり、以下の表になります。

閾値の計算方法 内容
cv2.ADAPTIVE_THRESH_GAUSSIAN_C 閾値に局所領域で閾値を計算する方法にガウス分布による重み付けを行った平均値を採用
ADAPTIVE_THRESHOLD_MEAN_C 閾値に局所領域の中央値を採用

 

閾値処理の種類は2種類あり、以下の表になります。

閾値処理の種類 処理内容
cv2.THRESH_BINARY 画素値が閾値(num1)以上の場合は最大値(num2)に、閾値以下の場合は0に変更
cv2.THRESH_BINARY_INV 画素値が閾値(num1)以上の場合は0に、閾値以下の場合は最大値(num2)に変更

 

それでは一例を描画します。

 

6. 各色成分の取出し(cv2.split())

画像の色を分解して、分解後の状態を可視化します。cv2.split()で画像の色を青、緑、赤に分解します。cv2.imread()で読み込んだ画像は青、緑、赤の順で値が格納されています。そのため、cv2.split()で分解後、0番目が青成分の画像、1番目が緑成分の画像、2番目が赤成分の画像になります。描画後はグレースケール画像になっていて、3つの色分解した画像で比較して白いほどその成分が強いと言えます。

それでは画像の色分解したいと思います。

出力結果は以下の様になります。例えば青成分の空部分は他の画像よりも白くなっており、その部分は青成分が強いと言えます。

【青成分】

【緑成分】

【赤成分】

 

7. HSV色空間変換

続いて、HSV色空間変換について説明します。HSV色空間は、H:色相(Hue)、S:彩度(Saturation)、V:明度(Value)を指しています。ここでは各成分の画像に分離したいと思います。HSV色空間への変換はcv2.cvtColor(img, cv2.COLOR_BGR2HSV)を用い、各成分の分離にはcv2.split()を用います。

【色相】

【彩度】

【明度】

 

さらに、各成分を変更することで元の画像の色相、彩度、明度を変更することができます。以下の例では、cv2.cvtColor(img, cv2.COLOR_BGR2HSV)でHSV変換して色相、彩度、明度の要素に分離後、彩度の倍率を1.5倍にしています。

 

出力結果は以下のようになります。元の画像と比べても変化があるのがよくわかりますね。

【彩度を修正した画像】

【元の画像】

 

オススメ書籍

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

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

 

スキル修得&転職

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

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

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

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

 

おわりに

本記事では、Opencvを用いた画像のグレースケール化、輝度平滑化、閾値処理(二値化)、各色成分の取出、HSV色空間変換に方法について紹介しました。画像処理では基本的な操作になるので、ぜひ覚えましょう。