見出し画像

OpenCV入門 (3) - 色空間の変更

OpenCVで「色空間の変更」を行う方法を説明します。最もよく使う、「BGR ⇄ Gray」と「BGR ⇄ HSV」の2つの変換を試してみます。

・Python 3.7
・OpenCV 4.5

前回

1. BGR ⇄ Gray

Webカメラ映像をGrayに変換して表示するプログラムは次の通りです。

import cv2

# キャプチャの準備
cap = cv2.VideoCapture(0)

while(True):
    # 元画像の取得
    ret, im_org = cap.read()
    if not ret:
        continue

    # RGBをGrayに変換
    im_gray = cv2.cvtColor(im_org, cv2.COLOR_BGR2GRAY)

    # イメージの表示
    cv2.imshow('gray', im_gray)

    # ESCで終了
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

# ウィンドウ破棄
cv2.destroyAllWindows()

RGBイメージをGrayイメージに変換するには、cvtColor()を使います。

dst = cv.cvtColor(src, code[, dst[, dstCn]])
    src: 入力イメージ
    dst: 出力イメージ
    code: 色空間変換コード
        cv2.COLOR_BGR2GRAY: グレースケール
        cv2.COLOR_BGR2GRAY: HSV
        他いろいろ
    dstCn: 出力イメージのチャンネル数

2. BGR ⇄ HSV

Webカメラ映像で青い部分のみ表示するプログラムは次の通りです。

import cv2
import numpy as np

# キャプチャの準備
cap = cv2.VideoCapture(0)

while(True):
    # 元画像の取得
    ret, im_org = cap.read()
    if not ret:
        continue
        
    # RGBをHSVに変換
    im_hsv = cv2.cvtColor(im_org, cv2.COLOR_BGR2HSV)

    # HSVの青の閾値の指定
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # マスク画像の生成
    im_mask = cv2.inRange(im_hsv, lower_blue, upper_blue)

    # 元の画像とマスク画像の合成
    im_res = cv2.bitwise_and(im_org, im_org, mask=im_mask)

    # イメージの表示
    cv2.imshow('res', im_res) # 元画像+マスク画像

    # ESCで終了
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

# ウィンドウ破棄
cv2.destroyAllWindows()

HSV、以下の3要素で色を表現します。RGBと比べて光の影響を受けにくいのが特徴になります。

・色相 (Hue) :  赤、黄、緑、青などの色の種類 (環状に0〜180)
・彩度 (Saturation) : 色の鮮やかさ (0〜255)
・明度 (Value) : 色の明るさ (0〜255)

画像1

RGBイメージをHSVイメージに変換するには、cv2.cvtColor()を使います。HSVイメージに変換後、青の閾値でマスク画像を作成し、元画像とマスク画像を合成して青い部分のみ表示します。

青の閾値でマスク画像を生成するには、cv2.inRange()を使います。

dst = cv.inRange(src, lowerb, upperb[, dst])
    src: 入力配列
    lowerb: 下限境界配列またはスカラー
    upperb: 上限境界配列またはスカラー
    dst: 出力配列

元画像とマスク画像の合成を行うには、cv2.bitwise_and()を使います。

dst = cv.bitwise_and(src1, src2[, dst[, mask]])
    src1: 最初の入力配列またはスカラー
    src2: 2番目の入力配列またはスカラー
    dst: 出力配列
    mask: マスク(8ビットの単一チャネル配列)

【おまけ】 画像情報

画像情報を取得するスクリプトは、次のとおりです。

print('shape:', image.shape) # (幅, 高さ, チャネル)
print('size:', image.size) # サイズ
print('dtype:', image.dtype) # データ型
print('image[20, 160]:', image[20, 160]) # [20, 160]の色
shape: (320, 320, 3)
size: 307200
dtype: uint8
image[20, 160]: [  0   0 255]

【おまけ】 Webカメラの解像度とFPS

Webカメラの解像度とFPSの指定を行うコードは、次のとおりです。Webカメラで利用できない値が指定された場合は、近い値に補正されます。

# 解像度とFPSの指定
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
cap.set(cv2.CAP_PROP_FPS, 10)

# 解像度とFPSの取得
print('width', cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print('height', cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print('fps', cap.get(cv2.CAP_PROP_FPS))
width: 640.0
height: 480.0
fps: 10.0

次回


この記事が気に入ったらサポートをしてみませんか?