【Python+OpenCV】特定の色を検出するプログラム

今回の記事では、OpenCVライブラリを用いて、1枚の画像から特定の色を検出する方法について解説します。

この記事はこんな人におすすめ!

  • OpenCVで画像処理を学んでいる人
  • Python初心者

それでは始めましょう!

目次

サンプルプログラム

サンプルプログラムは以下のようになります。

import cv2 as cv
import numpy as np

#画像データの読み込み
img = cv.imread("sample.jpg")

#BGR色空間からHSV色空間への変換
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

#色検出しきい値の設定
lower = np.array([90,64,0])
upper = np.array([150,255,255])

#色検出しきい値範囲内の色を抽出するマスクを作成
frame_mask = cv.inRange(hsv, lower, upper)

#論理演算で色検出
dst = cv.bitwise_and(img, img, mask=frame_mask)

cv.imshow("img", dst)

if cv.waitKey(0) & 0xFF == ord('q'):
    cv.destroyAllWindows()

青色のみを検出するよう色しきい値を設定し、1枚の画像の青色部のみを表示しました。色しきい値を変更することによって、赤色や緑色など様々な色を検出することが出来ます。

実行結果

元画像です。

プログラム実行結果です。青色の花と空が検出され、他は黒くなって表示されました。

【Pythonで学ぶ】OpenCVでの画像処理入門

HSV色空間を理解する

サンプルプログラムの解説をしていきます。openCVのcv.imread()は、BGR色空間で読み込まれます。色検出する場合、HSV空間の方が色検出しきい値を指定しやすいので、BGR色空間からHSV色空間に変換します。

#画像データの読み込み
img = cv.imread("sample.jpg")

#BGR色空間からHSV色空間への変換
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

HSV色空間とは、「色相(Hue)」「彩度(Saturation)」「明度(Value・Brightness)」の3要素から成る色空間です。各要素の説明は以下表のとおりとなります。HSV色空間の値とOpenCVの値は異なるので、注意が必要です。

説明値範囲OpenCVの値範囲
色相(H)色合い。赤が0度で360度まで虹色の順で変化する。0-360度0-180
彩度(S)色の鮮やかさ。100%が純色で低くなるにつれて白くなる。0-100%0-255
明度(V)色の明るさ。100%が純色で低くなるにつれて暗くなる。0-100%0-255

検出する色範囲を設定し、マスクをかける

青系の色を検出をするために、色相が90-150(180-300度)、彩度が64-255(25-100%)、明度が0-255(0-100%)の範囲を抽出するマスクを作成します。作成するにはcv.inRange()を使用します。cv.inRange()は、指定したい範囲の色を255、それ以外の範囲の色を0として2値化します。第1引数に2値化したい画像を指定します。第2引数、第3引数で色範囲を指定します。

#色検出しきい値の設定
lower = np.array([90,64,0])
upper = np.array([150,255,255])

#色検出しきい値範囲内の色を抽出するマスクを作成
frame_mask = cv.inRange(hsv, lower, upper)

下図は2値化した画像です。青色部が白、それ以外は黒になりました。

#論理演算で色検出
dst = cv.bitwise_and(img, img, mask=frame_mask)

cv.bitwise_and()でマスクをかけ、cv.imshow()で表示させると実行結果の通り青色のみ検出されます。

色検出しきい値を変えてみる

色検出しきい値を変えて、違う色も検出してみましょう。まずは緑です。色相範囲は30-90(60-180度)としました。

#色検出しきい値の設定
lower = np.array([30,64,0])
upper = np.array([90,255,255])

#色検出しきい値範囲内の色を抽出するマスクを作成
frame_mask = cv.inRange(hsv, lower, upper)

花の葉と木の葉が検出されました。

次は赤です。赤は0-30(0-60度)、150-180(300-360度)です。色範囲が2条件となりますので、プログラムに工夫が必要です。

#色検出しきい値の設定
lower = np.array([0,64,0])
upper = np.array([30,255,255])

#色検出しきい値範囲内の色を抽出するマスクを作成
frame_mask1 = cv.inRange(hsv, lower, upper)

#色検出しきい値の設定
lower = np.array([150,64,0])
upper = np.array([180,255,255])

#色検出しきい値範囲内の色を抽出するマスクを作成
frame_mask2 = cv.inRange(hsv, lower, upper)

frame_mask = frame_mask1 + frame_mask2

2つのマスクを足し合わせています。赤、オレンジ、黄色の花が検出されました。

まとめ

以上、OpenCVを使って特定の色を検出するプログラムの解説でした。

おさらいしますと

  • HSV色空間について理解
  • 検出する色範囲を設定し、マスクをかける方法を学習
  • 色検出しきい値を変えて結果の違いを確認

Python、OpenCV学習のお役に立てたなら幸いです。

独りでPython学習するのは大変だなと思う方は、書籍やスクールを活用するのも手です。

プログラミング言語の人気オンラインコース

最後までお読み頂きありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

大学で機械工学を学んだ後、製造業で働く40代の会社員です。
IT系、電気系を学んでこなかった機械系人間が、ゲーム制作、電子工作に奮闘してます。
極力低コストでものづくりを楽しむのがモットー。

目次