• 検索結果がありません。

例題2 色空間の変換 - RGB 色空間から YCrCb 色空間への変換 -

第 4 章 実践 TEO プログラミング - 構造編 27

4.2 例題2 色空間の変換 - RGB 色空間から YCrCb 色空間への変換 -

(a)入力カラー画像 (b)濃淡画像 図4.1 RGBカラーから濃淡値への変換結果

4.2 例題2 色空間の変換 - RGB 色空間から YCrCb 色空間への変換

-ここでは前の例題とはちょっと異なる色変換を扱ってみましょう. RGB色空間をYCrCb色空間へ変換して みます.

YCrCb色空間とは,色情報を輝度信号Y(濃淡信号)と色差信号Cr, Cb(色信号)に分離したものです. Yは 輝度を, Crは赤の色差, Cbは青の色差を表します. NTSC信号はこのYCrCb信号です.

RGB色空間からYCrCb色空間への変換は一般に次式が用いられます.



Y = 0.2989×R+ 0.5866×G+ 0.1145×B Cr = 0.5000×R−0.4183×G−0.0816×B Cb = 0.1687×R−0.3312×G+ 0.5000×B

(4.2)

式(4.2)を見てもわかるように, YCrCb値はTEO UINT8の範囲では表現できないようです. そこで,変換 して得られたYCrCb値を画素値の型TEO FLOAT64の画像として保存します. 前回と同様にプログラムの 仕様を考えてみてください. プログラム名はteo rgb2ycとします. 図4.2にRGBカラー画像からYCrCb画 像への変換結果を示します.

teo rgb2ycの仕様❧

³

入力 : RGB画素値を持つTEO画像(画素値の型:TEO UINT8, プレーン数:3) 出力 : YCrCbTEO画像(画素値の型:TEO FLOAT64,プレーン数:3)

動作 : 入力画像のRGB値をYCrCb値に変換し,そのYCrCb値をTEO FLOAT64の画素値とする3 プレーンのTEO画像を標準出力に出力します.

µ ´

ソースコードをリスト4.2に示します.

このプログラムもメイン関数と色変換を行う関数とに分かれています. 色変換を題材にしていますから,前 回のプログラムと比較して大部分が同じ内容になっています.

メイン関数の前回のソースコードとの変更点は, 62行目の関数の引数です. 出力画像の画素値の型が TEO UINT8からTEO FLOAT64に,プレーン数が1から3に変わっています.

次に色空間を変換する関数を見てみましょう.

変数の宣言(11行目) Y, Cr, Cbの値用にTEO FLOAT64型の変数を宣言しています.

出力画像データの領域確保(14–20行目) 出力画像データ用のメモリを確保します. 入力画像データとサイズ, オフセットまでが入力データと同じで,画素値の型はTEO FLOAT64,プレーン数が3 になっているこ とに注意して下さい.

画像の走査(22–23行目) 画像を左上から水平に順に走査して全ての画素を処理するためのループです. 画像 を走査する最も基本となる部分です.

RGB値の取得(24–26行目) 入力画像データの第1プレーンが赤プレーン,第2プレーンが緑プレーン,第3 プレーンが青プレーンとして(プログラムでは第1プレーンに対応するプレーン番号は0 であることに 注意して下さい),TeoGetPixelによって, TEOIMAGE構造体を介して画素座標(x, y)の各プレーンで の画素値を獲得しています.

YCrCb値の計算(28–30行目) 式(4.2)に従ってRGB値からYCrCb値を計算し, 各変数に代入します. 画素値の書き込み(32–34行目) 計算した YCrCb値をTeoPutPixelによって出力画像データの画素座標

(x, y)の各プレーンに書き込む. この時, 出力画像データの画素値の型は TEO FLOAT64なので,

TeoPutPixelに指定する画素値の型はTEO FLOAT64であることに注意して下さい. リスト4.2 RGB画像からYCrCb画像への変換

1 # i n c l u d e <s t d i o . h >

2 # i n c l u d e <t e o . h > / * T E Oラ イ ブ ラ リ 用 の ヘ ッ ダ フ ァ イ ル * /

3

4 s t a t i c T E O I M A G E* f u n c _ r g b 2 y c (T E O I M A G E * s r c ) ;

5

6 s t a t i c T E O I M A G E*

7 f u n c _ r g b 2 y c (T E O I M A G E * s r c ) {

8 T E O I M A G E * d s t ;

9 i n t row , c o l ;

10 T E O _ U I N T 8 r , g , b ;

11 T E O _ F L O A T 6 4 Y , Cr , C b ;

12

13 / * Y C r C b画 像 デ ー タ の 領 域 確 保 * /

14 d s t = T e o A l l o c I m a g e ( T e o W i d t h ( s r c ) ,

15 T e o H e i g h t ( s r c ) ,

16 T e o X o f f s e t ( s r c ) ,

17 T e o Y o f f s e t ( s r c ) ,

18 T E O _ F L O A T ,

19 64 ,

20 3 ) ;

21 / * Y C r C b画 像 へ の 変 換 * /

22 f o r ( r o w = T e o Y s t a r t ( s r c ) ; r o w <= T e o Y e n d ( s r c ) ; r o w + + ) {

23 f o r ( c o l = T e o X s t a r t ( s r c ) ; c o l <= T e o X e n d ( s r c ) ; c o l + + ) {

24 r = T e o G e t P i x e l ( src , col , row , 0 , T E O _ U I N T 8) ;

25 g = T e o G e t P i x e l ( src , col , row , 1 , T E O _ U I N T 8) ;

26 b = T e o G e t P i x e l ( src , col , row , 2 , T E O _ U I N T 8) ;

27

4.2 例題2 色空間の変換- RGB色空間からYCrCb色空間への変換- 33

28 Y = 0 . 2 9 8 9 * r + 0 . 5 8 6 6 * g + 0 . 1 1 4 5 * b ;

29 C r = 0 . 5 0 0 0 * r - 0 . 4 1 8 3 * g - 0 . 0 8 1 6 * b ;

30 C b = - 0 . 1 6 8 7 * r - 0 . 3 3 1 2 * g + 0 . 5 0 0 0 * b ;

31

32 T e o P u t P i x e l ( dst , col , row , 0 , T E O _ F L O A T 6 4, Y ) ;

33 T e o P u t P i x e l ( dst , col , row , 1 , T E O _ F L O A T 6 4, C r ) ;

34 T e o P u t P i x e l ( dst , col , row , 2 , T E O _ F L O A T 6 4, C b ) ;

35 }

36 }

37 r e t u r n d s t ;

38 }

39 40 i n t

41 m a i n (i n t a r g c ,

42 c h a r * * a r g v ) {

43 T E O F I L E * s r c _ t e o f p , * d s t _ t e o f p ;

44 T E O I M A G E * s r c _ i m g , * d s t _ i m g ;

45

46 / * 引 数 の チ ェ ッ ク * /

47 i f ( a r g c ! = 2 ) {

48 f p r i n t f ( s t d e r r , " U s a g e : à % s à i n . t e o \ n " , a r g v [ 0 ] ) ;

49 e x i t ( 1 ) ;

50 }

51 / * 入 力 画 像 の 読 み 込 み * /

52 s r c _ t e o f p = T e o O p e n F i l e ( a r g v [ 1 ] ) ; / * T E Oフ ァ イ ル の オ ー プ ン * /

53 s r c _ i m g = T e o A l l o c S i m i l a r I m a g e ( s r c _ t e o f p ) ;/ * 画 像 デ ー タ 用 の メ モ リ 確 保 * /

54 T e o R e a d F r a m e ( s r c _ t e o f p , s r c _ i m g ) ; / * 画 像 デ ー タ を メ モ リ に コ ピ ー * /

55

56 / * 入 力 画 像 を チ ェ ッ ク * /

57 i f ( T e o P l a n e ( s r c _ i m g ) < 3 | | ! T e o I s U I N T 8 ( s r c _ i m g ) ) {

58 f p r i n t f ( s t d e r r , " W r o n g à i m a g e à t y p e ! \ n " ) ;

59 g o t o s e t t l e ;

60 }

61 / * 出 力 画 像 の 生 成 * /

62 d s t _ t e o f p = T e o C r e a t e F i l e ( " -" ,

63 T e o W i d t h ( s r c _ i m g ) ,

64 T e o H e i g h t ( s r c _ i m g ) ,

65 T e o X o f f s e t ( s r c _ i m g ) ,

66 T e o Y o f f s e t ( s r c _ i m g ) ,

67 T E O _ F L O A T ,

68 64 ,

69 3 ,

70 1 ) ;

71 / * 濃 淡 画 像 へ の 変 換 * /

72 d s t _ i m g = f u n c _ r g b 2 y c ( s r c _ i m g ) ;

73

74 / * 出 力 画 像 デ ー タ を 出 力 フ ァ イ ル に 書 き 出 す * /

75 T e o W r i t e F r a m e ( d s t _ t e o f p , d s t _ i m g ) ;

76 s e t t l e :

77 / * フ ァ イ ル の ク ロ ー ズ * /

78 i f ( s r c _ t e o f p ) T e o C l o s e F i l e ( s r c _ t e o f p ) ;

79 i f ( d s t _ t e o f p ) T e o C l o s e F i l e ( d s t _ t e o f p ) ;

80

81 / * 確 保 し た デ ー タ の 解 放 * /

82 i f ( s r c _ i m g ) T e o F r e e I m a g e ( s r c _ i m g ) ;

83 i f ( d s t _ i m g ) T e o F r e e I m a g e ( d s t _ i m g ) ;

84

85 r e t u r n 0 ;

86 }

(a)入力カラー画像 (b) YCrCb画像

(c) Yプレーン (d) Crプレーン (e) Cbプレーン

図4.2 RGB色空間からYCrCb色空間への変換結果

関連したドキュメント