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)
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
次回
この記事が気に入ったらサポートをしてみませんか?