静止画を保存する際のカラーフォーマットの選択方法

概要

静止画を保存する際のカラーフォーマットの選択は、具体的な使用ケースや要件によります。一般的に、RGBは一般的な画像表示用途に最適です。対照的に、HSVは色相に基づくフィルタリングや調整に便利です。グレースケールは情報量を減らし、視覚的なノイズを減らすために使用されます。YCrCbは色と明度を分離するため、画像圧縮や肌色の検出に適しています。そして、Labは人間の視覚に近い色の表現を可能にし、色の比較や差異の測定に適しています。これらの適切なカラーフォーマットの選択は、画像処理する上で重要です。

補足:不透明度/色深度

不透明度 アルファ値(α値)とも言われは、デジタル画像データにおいて色情報とは別に、画素ごとに設けられた付加情報を表す数値です。多くの場合0~255で色情報に加えて利用され、0が透明で255が不透明です。
色深度 色深度とは、デジタル画像において1ピクセルが表現できる色数の表現です。色深度の表現は一般的に1ピクセル当たりのビット数で表現され、単位としてbpp(bits per pixel)などが用いられます。 例えば、一般的に「8ビットカラー」と呼ばれる方式の色深度は8bppとなります。

出力結果

オリジナル
オリジナルの画像
グレースケール
グレースケール画像
HSV
HSV形式に変換した画像
RGB
BGR形式のフレームをRGB形式に変換
YCrCb
YCrCb色空間への変換
Lab
Lab色空間に変換した画像

プログラム全体

#解説1 import cv2 #解説2 # UVCカメラを開始 cap = cv2.VideoCapture(0) #解説3 # フレームを取得 ret, frame = cap.read() #解説4 # オリジナル # 画像を保存(JPEG形式) cv2.imwrite('output_original.jpg', frame) # カラーフォーマットを変更(ここではHSVに変換) hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 画像を保存(JPEG形式) cv2.imwrite('output_hsv.jpg', hsv_frame) #解説5 # カラーフォーマットを変更(ここではグレースケールに変換) gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 画像を保存(JPEG形式) cv2.imwrite('output_gray.jpg', gray_frame) #解説6 # カラーフォーマットを変更(ここではRGBに変換) rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 画像を保存(JPEG形式) cv2.imwrite('output_rgb.jpg', rgb_frame) #解説7 # カラーフォーマットを変更(ここではYCrCbに変換) ycrcb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb) # 画像を保存(JPEG形式) cv2.imwrite('output_ycrcb.jpg', ycrcb_frame) #解説8 # カラーフォーマットを変更(ここではLabに変換) lab_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2Lab) # 画像を保存(JPEG形式) cv2.imwrite('output_lab.jpg', lab_frame) output_lab_L, output_lab_a, output_lab_b = cv2.split(lab_frame) cv2.imwrite('output_lab_L.jpg', output_lab_L) cv2.imwrite('output_lab_a.jpg', output_lab_a) cv2.imwrite('output_lab_b.jpg', output_lab_b) #解説9 # カメラを解放 cap.release()

解説

解説1:OpenCVライブラリのインポート

import cv2

PythonのOpenCVライブラリをインポートしています。OpenCVは、画像処理やコンピュータビジョンに関する機能を提供するオープンソースのライブラリです。このライブラリをインポートすることで、後のコードでOpenCVの機能を使うことができます。例えば、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。

産業用UVCのすすめ

解説2:カメラの起動

# UVCカメラを開始 cap = cv2.VideoCapture(0)

ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCaptureオブジェクトを返しています。ここでの0は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。

補足:OpenCVにおけるデバイスID

デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。 TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html

解説3:フレームの取得

# フレームを取得 ret, frame = cap.read()

cap.read()はカメラから一枚の画像を取得します。cap.read()は、カメラから画像を読み込むためのメソッドで、retimageのそれぞれに値を返します。retは画像の読み込みが成功したかどうかを示すブール値(TrueまたはFalse)、imageは取得した画像データです。TheImagingSource社のDFK33Uシリーズは、YUY2のカラーフォーマットで画像出力可能です。また、ドライバーを入れることでRGB64bitなども選択することができます。

解説4:オリジナル画像の保存とHSV色空間への変換

# オリジナル # 画像を保存(JPEG形式) cv2.imwrite('output_original.jpg', frame) # カラーフォーマットを変更(ここではHSVに変換) hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 画像を保存(JPEG形式) cv2.imwrite('output_hsv.jpg', hsv_frame)

ここでは、まずcv2.imwrite()関数を用いてオリジナルのフレームをJPEG形式で保存しています。

次にcv2.cvtColor()関数を使ってフレームの色空間をHSV(Hue, Saturation, Value)に変換し、これもJPEG形式で保存しています。 HSV色空間は、色相(Hue)、彩度(Saturation)、明度(Value)の3つの要素から成ります。色相は色の種類(赤、青、緑など)を表し、彩度はその色がどれほど鮮やかか(または淡いか)を示し、明度は色の明るさを表します。

一例として、機械学習やコンピュータビジョンのアプリケーションでは、特定の色を持つオブジェクトを画像内で検出するためにHSV色空間を用いることがあります。RGB色空間では色情報が3つのチャンネル(赤、緑、青)に分散しているのに対し、HSVでは色を「鮮やかさ」「明るさ」といった直感的な表現しているため、「この色を明るくしたい・暗くしたい」「色を薄くしたい・濃くしたい」といった人間の感覚に近い指標で感覚的な調整が簡単にできます。色相情報が一つのチャンネルにまとまっているため、特定の色相範囲を指定することで特定の色を簡単に抽出できます。例えば、特定の色の物体追跡等に利用されます。

解説5:グレースケールへの変換

# カラーフォーマットを変更(ここではグレースケールに変換) gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 画像を保存(JPEG形式) cv2.imwrite('output_gray.jpg', gray_frame)

同様にcv2.cvtColor()関数を用いて色空間をグレースケールに変換し、それをJPEG形式で保存しています。グレースケールは色情報が必要ない場合や、計算コストを減らしたい場合に特によく使われます。 グレースケール画像は色情報を持たず、輝度の情報のみ持つため、画商処理の計算が軽減されます。これは、リアルタイム処理などの画像処理や機械学習をする上でメリットとなります。カラー画像を扱う場合にはデータ量がRGBそれぞれに対しての輝度情報が必要となるためモノクロの情報の3倍となり、処理時間やメモリ消費を多く消費します。 具体的な使用例として、エッジ検出や色を必要としないパターン認識、光度の変化を捉えるモーション検出などがあります。これらの画像処理は、色情報よりも明暗の変化が重要となるため、グレースケール画像が使用されます。また、顔認識のような高度なタスクでも、グレースケール変換は前処理の一部としてよく用いられます。 ただ、カラー情報が初めから必要がない場合はモノクロカメラを選択することが一般的です。TheImagingSource社のカメラではUVCに対応したモノクロカメラも取り扱っております。

解説6:RGB色空間への変換

# カラーフォーマットを変更(ここではRGBに変換) rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 画像を保存(JPEG形式) cv2.imwrite('output_rgb.jpg', rgb_frame)

次に、BGR形式のフレームをRGB形式に変換し、それをJPEG形式で保存しています。 OpenCVでは、デフォルト画像はBGR(Blue-Green-Red)形式で読み込まれます。しかし産業用カメラの場合にはRGB(Red-Green-Blue)形式が標準とされています。 出力結果で画像が赤っぽくなっているのはオリジナルのRGB形式の画像をBGR形式として認識し、RGB形式の画像として画像処理したためです。

解説7:YCrCb色空間への変換

# カラーフォーマットを変更(ここではYCrCbに変換) ycrcb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb) # 画像を保存(JPEG形式) cv2.imwrite('output_ycrcb.jpg', ycrcb_frame)

フレームをYCrCb色空間に変換し、それをJPEG形式で保存しています。YCrCb色空間は、画像や動画のデータ圧縮でよく用いられます。 YCrCbはカラーモデルの一種で、画像を「輝度情報(Y)」と「色差情報(CrとCb)」に分割します。輝度情報はグレースケール画像を表し、色差情報は色情報を表します。 YCrCb色空間への変換は、画像の圧縮において重要です。というのも人間の視覚は輝度に対して敏感であり、色差に対してはそれほど敏感ではないため、色差情報を圧縮または縮小することで、見た目の品質を大幅に損なうことなくデータ量を削減できます。この性質はJPEGやMPEGといったエンコードにおいて利用されています。

さらに、この色空間は肌色検出にもよく使用されます。YCrCb色空間は肌色の変動をよく捉えるため、人間の顔や手などの検出に有効です。これは、ビデオチャットの背景ぼかし、顔認識、手ジェスチャ認識などの応用に利用されています。 それでも、一部の用途(例:特定の色の物体を検出する)では、HSVやRGBといった他の色空間の方が適していることもあります。

解説8:Lab色空間への変換

# カラーフォーマットを変更(ここではLabに変換) lab_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2Lab) # 画像を保存(JPEG形式) cv2.imwrite('output_lab.jpg', lab_frame) output_lab_L, output_lab_a, output_lab_b = cv2.split(lab_frame) cv2.imwrite('output_lab_L.jpg', output_lab_L) cv2.imwrite('output_lab_a.jpg', output_lab_a) cv2.imwrite('output_lab_b.jpg', output_lab_b)

最後に、フレームをLab色空間に変換し、それをJPEG形式で保存しています。Lab色空間は、色の見え方が人間の視覚に近いように設計されています。 Lab色空間(またはCIELAB色空間)は、人間の視覚により近い色の表現を可能にする色空間です。これは、色の差異が人間の視覚的な差異により一致するように設計されています。

Lab色空間は、色の比較や色の差異の測定にしばしば使用されます。たとえば、色補正や色の調整などのタスクでは、Lab色空間は非常に役立ちます。これは、色相(色の種類)と彩度(色の強さ)が明るさから分離されているため、色相と彩度を変更しても明るさは変わらないからです。

また、画像セグメンテーションや物体検出、特に色が重要な要素である場合には、Lab色空間は有用です。たとえば、肌色や天空の色など、特定の色範囲を検出するためには、Lab色空間での操作が有効です。

ただし、この色Lab色空間の多くの色がディスプレイで表現可能な色を超えています。そのため、直接表示や処理を行う前に適切な色空間に変換する必要があります。

解説9:カメラの解放

# カメラを解放 cap.release()

ここでは、カメラリソースを解放しています。カメラやファイルなどのリソースを開いた後は、それらがもう必要ないときには必ず解放する必要があります。これにより、そのリソースを他のプログラムが使用できるようになります。この行がないと、プログラムが終了してもカメラが開いたままになり、他のプログラムから使用できなくなる可能性があります。

まとめ:

以下に各カラーフォーマットの特徴と使用するシチュエーションを表形式でまとめます。

カラーフォーマット 特徴 使用するシチュエーション OpenCVのAPI
HSV 色相(Hue)、彩度(Saturation)、明度(Value)の3要素で色を表現します。色相は色の種類、彩度は色の鮮やかさ、明度は色の明るさを表します。 色の種類や鮮やかさ、明るさを個別に操作したい場合や、特定の色を抽出したい場合に使用します。 cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
グレースケール 色情報を持たず、明るさのみで画像を表現します。値が大きいほど白に近く、小さいほど黒に近いです。 色情報が不要で、明るさの情報のみが重要な場合や、画像処理の計算量を減らしたい場合に使用します。 cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
RGB 赤(Red)、緑(Green)、青(Blue)の3要素で色を表現します。各要素の値が大きいほどその色が強くなります。 一般的な画像表示や画像処理に広く使用されます。特に、ディスプレイやカメラなどのデバイスはRGBで色を表現することが多いです。 cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
YCrCb 明度(Y)と色差(Cr, Cb)の3要素で色を表現します。明度は白黒の情報、色差は色の情報を表します。 画像の圧縮や、人間の肌色の抽出などに使用されます。また、映像信号の伝送にも使用されます。 cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb)
Lab 明度(L)と色相(a, b)の3要素で色を表現します。明度は白黒の情報、色相は色の情報を表します。 色の差を人間の視覚に近い形で計算する場合や、色の補正、色の変換などに使用されます。人間の色覚と一致する色空間を提供します。 cv2.cvtColor(frame, cv2.COLOR_BGR2Lab)

色合いを変える目的はオブジェクトをはっきりさせることです。Lab色空間へ変換したあとに、L、a、bそれぞれのチャンネルを書き出すと、次のとおりです。

例えば下記のLab色空間への変換をした後、Labそれぞれに分解すると下記の通りです。

Lab色空間に変換した画像

L a b

Lチャンネルは明度をそのまま表記しています。

Lab色空間に変換した画像

aチャンネルは緑色と赤色を識別しているため、
はっきりとした特徴を識別できない。

Lab色空間に変換した画像

bチャンネルは黄色と青色を調整しており、
青い部分がしっかり識別できる。

Lab色空間に変換した画像

それぞれのアプリケーションに沿って使用する画像を使い分けることができます。