HSV色空間とは、「色相(Hue)」「彩度(Saturation)」「明度(Value)」の3つの組み合わせで色を表現する手法で、人間が色を知覚する方法と類似しているため、RGB色空間よりも人がイメージした通りの色を作りやすい特徴があります。「TFRecordファイルの可視化とアノテーション画像の取得」の「アノテーション画像の取得」で取得した信号機のアノテーション画像を使用して、赤色、緑色を検出します。

HSV色空間での赤色、緑色、青色の範囲

HSV色空間での赤色、緑色、青色の範囲を次に示します。

値の範囲 値の範囲(OpenCVの場合)
赤色のHue 0~60 300~360[度] 0~30 150~179
緑色のHue 60~189[度] 30~90
青色のHue 180~300[度] 90~150
S 25~100[%] 64~255
V 00~100[%] 0~255

色検出スクリプトの作成

信号機のアノテーション画像を使用して、赤色、緑色を色検出スクリプト「signaldetect」で検出します。

main.py

import cv2
import numpy as np

INIMAGE_DIR = 'in_cut_images/'
COLOR_DIR = 'out/'


# 赤色の検出
def detect_red_color(img):
    # HSV色空間に変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 赤色のHSVの値域1
    hsv_min = np.array([0, 64, 0])
    hsv_max = np.array([30, 255, 255])
    mask1 = cv2.inRange(hsv, hsv_min, hsv_max)

    # 赤色のHSVの値域2
    hsv_min = np.array([150, 64, 0])
    hsv_max = np.array([179, 255, 255])
    mask2 = cv2.inRange(hsv, hsv_min, hsv_max)

    # 赤色領域のマスク(255:赤色、0:赤色以外)
    mask = mask1 + mask2

    # マスキング処理
    masked_img = cv2.bitwise_and(img, img, mask=mask)

    return mask, masked_img


# 緑色の検出
def detect_green_color(img):
    # HSV色空間に変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 緑色のHSVの値域1
    hsv_min = np.array([30, 64, 0])
    hsv_max = np.array([90, 255, 255])

    # 緑色領域のマスク(255:赤色、0:赤色以外)
    mask = cv2.inRange(hsv, hsv_min, hsv_max)

    # マスキング処理
    masked_img = cv2.bitwise_and(img, img, mask=mask)

    return mask, masked_img


# 青色の検出
def detect_blue_color(img):
    # HSV色空間に変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 青色のHSVの値域1
    hsv_min = np.array([90, 64, 0])
    hsv_max = np.array([150, 255, 255])

    # 青色領域のマスク(255:赤色、0:赤色以外)
    mask = cv2.inRange(hsv, hsv_min, hsv_max)

    # マスキング処理
    masked_img = cv2.bitwise_and(img, img, mask=mask)

    return mask, masked_img


def main():
    # 入力画像の読み込み
    for fileName in fnmatch.filter(os.listdir(INIMAGE_DIR), '*.jpg'):
        path, ext = os.path.splitext(os.path.basename(fileName))
        img = cv2.imread(INIMAGE_DIR + fileName)

        blur = cv2.GaussianBlur(img, ksize=(3, 3), sigmaX=1.3)

        # 色検出(赤、緑、青)
        red_mask, red_masked_img = detect_red_color(blur)
        green_mask, green_masked_img = detect_green_color(blur)
        blue_mask, blue_masked_img = detect_blue_color(blur)

        # 結果を出力
        cv2.imwrite(COLOR_DIR + path + "_red_mask.jpg", red_mask)
        cv2.imwrite(COLOR_DIR + path + "_red_img.jpg", red_masked_img)
        cv2.imwrite(COLOR_DIR + path + "_green_mask.jpg", green_mask)
        cv2.imwrite(COLOR_DIR + path + "_green_img.jpg", green_masked_img)
     #   cv2.imwrite(COLOR_DIR + path + "_blue_mask.jpg", blue_mask)
     #   cv2.imwrite(COLOR_DIR + path + "_blue_img.jpg", blue_masked_img)


if __name__ == "__main__":
    main()

色検出スクリプトの実行

信号機のアノテーション画像を入力として、赤色、緑色を色検出スクリプト「signaldetect」を実行します。次のようなマスクとそれを使って検出した画像がフォルダに保存されます。