画像の RGB  YUV(YCbCr)  HSV 相互変換



0、初めに

通常画像データは、RGB 形式で記録するが、色情報を操作する場合は、YUV 形式や、HSV 形式を用いる方が
都合が良い場合が多い。 ここでは下記定義を用いた画像の相互変換を検討し、実装する。
本来は、可逆変換である事が望ましいが、簡略化と汎用性を考慮し、各コンポーネントのデータを 0~ 255 範囲
で表現して、概データを BMP 形式のファイルとして保存する事で、可読性の考慮を行う。
RGB データから、HSV データに変換した後、BMP形式で保存したファイルを、再度読み込み、HSV ⇒ RGB 変換
すると、見た目ではそん色ない再現性が得られるが、データー的には異なってしまっている事を、画像処理を行う
上では考慮しなければならない。  (また、整数データに変換する時は、四捨五入の処理を行う事)
※ここでの色変換はデータ量の圧縮が目的ではなく、画像処理用であり精度の保持(YUV4:4:4)を重視している
注意:
ここで使用している変換式は、多数あるアルゴリズムの中の一つで保証するものではありません。 自己の
利用範囲に於いて、支障がないだけである事に注意ください。 適切な変換アルゴリズムは確認して下さい。
コンパクトに情報を整数で記述できる事が主で、特に変換式自体は孫引きですので注意して下さい。

AIの作成した、色空間の相互変換プログラム は、こちらを確認してください。


RGB YUV(YCbCr)  HSVの要素及びそのデータ範囲

データ範囲 データ変換方法
記録方式 エレメント
下限 上限 RAW ⇒ 0 - 255 変換 0 - 255 ⇒ RAW変換
RGB  R, G, B 0 255 - -
YUV
(YCbCr)
 Y 0 255 - -
 U(Cb),V(Cr) -128 127  +128 -128
HSV  H -3.141590 3.141590 (255.0*(H+M_PI))/(2*M_PI) (X*2*M_PI)/255.0 -M_PI
 S 0.00 136.162 S*1.87 X/1.87
 V 0.0 255.0 - -
  ※ X: 0 ~ 255
  ※ M_PI: 3.141593
  ※ -128 ~ 127 <=> -127.50 ~ 127.50

RGB  -> YUV(YCbCr)  -> HSV 変換

記録方式 エレメント間の変換式
RGB  R = R
 G = G
 B = B
YUV
(YCbCr)
 Y(Y)  =  0.299*R + 0.587*G + 0.114*B
 U(Cb) = -0.169*R - 0.331*G + 0.500*B
 V(Cr) =  0.500*R - 0.419*G - 0.081*B
HSV  H = atan2( (0.5*R-0.419*G-0.081*B), (-0.169*R-0.331*G+0.5*B) )
 S = sqrt( pow((-0.169*R-0.331*G+0.5*B),2.)+pow((0.5*R-0.419*G-0.081*B),2.) );
 V = 0.299*R + 0.587*G + 0.114*B

HSV  -> YUV(YCbCr)  -> RGB変換

記録方式 エレメント間の変換式
RGB  R = 1.0*V                  + 1.402*S*sin(H)
 G = 1.0*V - 0.344*S*cos(H) - 0.714*S*sin(H)
 B = 1.0*V + 1.772*S*cos(H)

 R = 1.0*Y(Y)               + 1.402*V(Cr)
 G = 1.0*Y(Y) - 0.344*U(Cb) - 0.714*V(Cr)
 B = 1.0*Y(Y) + 1.772*U(Cb)
YUV
(YCbCr)
 Y(Y)  = V
 U(Cb) = S * cos(H)
 V(Cr) = S * sin(H)
HSV  H = H
 S = S
 V = V
  YUV's V -> V(Cr)
  ※ HSV's V -> V



1、 RGB ファイルとして保存する時の、格納順に関して

RGB 情報において、G情報が最も輝度情報に近いので、YUV、HSV 形式における輝度情報は、Gチャンネルに記録する。
その他の情報は、下記変換を行って、残りのチャンネルに値を記録する。

HSV形式のデータをBMPファイルとして保存する場合は、(R,G,B)=(H,V,S) とする。
#include<math.h>;
G = V;
B = S * 1.87 ;
R = (255.0 * (H + M_PI)) / (2*M_PI);


YUV形式のデータをBMPファイルとして保存する場合は、(R,G,B)=(VCr,Y,UCb) とする。
G = Y;
B = UCb +128;
R = VCr +128;




2、プログラムに関して

本プログラムは、24ビット形式或いは32ビット形式の BMPファイルを読み込み、RGB 形式のデータを、YUV 形式或いは、
HSV 形式のデータに変換し、結果の YUV データ或いはHSVデータを、
32ビット BMP形式のファイルとして保存します。
各データ要素毎に取り得るデータ範囲が異なりますので、変換処理を施して、8ビット(0~255) の範囲に丸めます。

bmp2hsv.exe   BMPファイルを読み込み、HSVデータに変換後、BMPファイル形式で HSVデータを保存
bmp2yuv.exe   BMPファイルを読み込み、YUVデータに変換後、BMPファイル形式で YUVデータを保存
bmp4e2hsv.exe   bmp2hsv.exe の機能に、HSVの各データ毎のBMP形式のファイルを作成
bmp4e2yuv.exe   bmp2yuv.exe の機能に、YUVの各データ毎のBMP形式のファイルを作成
hsv2rgb.exe   BMP形式で保存された HSVデータを読み込み、RGB形式に変換後、BMPファイルとして保存
yuv2rgb.exe   BMP形式で保存された YUVデータを読み込み、RGB形式に変換後、BMPファイルとして保存
lena.bmp   変換テスト用の BMPファイル




3、変換処理

本プログラムで、BMPファイルを読み込み、変換処理を行った結果。

lena
lena_yuv lena_hsv.bmp
original RGB -> YUV RGB -> HSV


lena_yuv_y lena_yuv_u lena_yuv_v
YUV: Y data YUV: U(Cb) data YUV: V(Cr) data
lena_yuv.bmp

YUV データから
RGBデータに変換
lena_yuv2rgb


lena_hsv_h lena_hsv_s lena_hsv_v
HSV: H data HSV: S data HSV: V data
lena_hsv

HSV データから
RGBデータに変換
lena_hsv_rgb



4、プログラムのダウンロード

本プログラムは、下記のリンクからダウンロードできます。

windows.zip  windows 実行形式 MD5SUM: 2b854d6a4cd15267da2a1e89afd623b0
source.zip  ソースコード (C言語) MD5SUM: 6457c00102a0462f3686b4c0da7909cf
lena.bmp  BMP file
exe obsoleted  windows 実行形式 MD5SUM: e695c8cf11ef3182bc61db8e6fa63b2a
src obsoleted  ソースコード (C言語) MD5SUM: 5d9376285eba20206b10c0c619c41799

 注:source.zip のリンクが間違っていました。修正(update)しました。 2016/06/30



 
5、終わりに

画像処理を行う上で、色の操作が必要になる事は多いと思われます。 その時の参考になれば幸いです。




go to TopPage go to CategoryTop