今回の記事では、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枚の画像の青色部のみを表示しました。色しきい値を変更することによって、赤色や緑色など様々な色を検出することが出来ます。
実行結果
元画像です。

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


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学習するのは大変だなと思う方は、書籍やスクールを活用するのも手です。


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