はじめに
OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。
OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015)
https://www.youtube.com/watch?v=OUbUFn71S4s
インストールと簡単な使い方はこちら
http://qiita.com/olympic2020/items/d5d475a446ec9c73261e
静止画像のフィルター処理についてはこちら
OpenCVでエッジ検出してみる
動画ファイルの処理についてはこちら
OpenCVで動画をリアルタイムに変換してみる
OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみる
どのような動画処理をするにしても、1枚の画像をフィルタ処理することが基本になります。
今回は、画像処理の基本として、カラー画像をRGB画像に分離し表示してみます。
RGB分離アルゴリズム
カラー画像をRGBに分離するアルゴリズムについて説明しておきます。
まず、カラー画像をRGBに分離します。これは、cv2.split()で簡単にできます。
分離した画像は1チャンネル分のため、これをそのまま表示するとグレースケールとしての表示になります。
RGBに分離したあとに、それぞれの色で表示するためには、他の色をゼロ埋めの画像で補ったカラー画像を作ってあげる必要があります。
ゼロ埋めの画像を作るのは、numpy.zeros()で、3チャンネルを1画像にまとめるのは、cv2.merge()で行います。
RGBを分離して、それぞれの色で表示する流れを模式図にしてみました。プログラムを理解する際に参考にしてください。
プログラム
import cv2
import numpy as np
# 定数定義
FILE_PREFIX = "google"
ORG_FILE_NAME = "google_org.png"
BLUE_FILE_NAME = FILE_PREFIX + "_b.png"
GREEN_FILE_NAME = FILE_PREFIX + "_g.png"
RED_FILE_NAME = FILE_PREFIX + "_r.png"
ORG_WINDOW_NAME = "org"
BLUE_WINDOW_NAME = "blue"
GREEN_WINDOW_NAME = "green"
RED_WINDOW_NAME = "red"
# 元の画像を読み込む
org_img = cv2.imread(ORG_FILE_NAME, cv2.IMREAD_COLOR)
# ゼロ埋めの画像配列
if len(org_img.shape) == 3:
height, width, channels = org_img.shape[:3]
else:
height, width = org_img.shape[:2]
channels = 1
zeros = np.zeros((height, width), org_img.dtype)
# RGB分離
img_blue_c1, img_green_c1, img_red_c1 = cv2.split(org_img)
img_blue_c3 = cv2.merge((img_blue_c1, zeros, zeros))
img_green_c3 = cv2.merge((zeros, img_green_c1, zeros))
img_red_c3 = cv2.merge((zeros, zeros, img_red_c1))
# ウィンドウを作成
cv2.namedWindow(ORG_WINDOW_NAME)
cv2.namedWindow(BLUE_WINDOW_NAME)
cv2.namedWindow(GREEN_WINDOW_NAME)
cv2.namedWindow(RED_WINDOW_NAME)
# ウィンドウに表示
cv2.imshow(ORG_WINDOW_NAME, org_img)
cv2.imshow(BLUE_WINDOW_NAME, img_blue_c3)
cv2.imshow(GREEN_WINDOW_NAME, img_green_c3)
cv2.imshow(RED_WINDOW_NAME, img_red_c3)
# ファイルに保存
cv2.imwrite(BLUE_FILE_NAME, img_blue_c3)
cv2.imwrite(GREEN_FILE_NAME, img_green_c3)
cv2.imwrite(RED_FILE_NAME, img_red_c3)
# 終了処理
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imread()にcv2.IMREAD_UNCHANGEDを指定するとαプレーンありの4チャンネルの情報を取得することができます。一方、cv2.imread()にcv2.IMREAD_COLORを指定するとRGBプレーンのみの3チャンネルの情報を取得することができます。
今回は、RGBのみ取得するようにcv2.IMREAD_COLORを指定しました。
実行結果
Googleのホームページの白い部分を黒に加工した元画像をスクリプトでRGBの画像に分離してみました。