• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:YUV⇔RGB変換がうまくいきません。)

YUV⇔RGB変換での問題について

このQ&Aのポイント
  • YUV⇔RGB変換がうまくいかない問題について解決方法を教えてください。
  • 24bppRaw(R,G,Bの順番)をYUVに変換する式とYUVをRGBのrawに変換する式を使用していますが、画像がおかしくなる問題が発生しています。
  • 元のRGBに戻る方法や、正しい変換式について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jgk
  • ベストアンサー率75% (104/138)
回答No.1

式はソースからそのまま抜き出してきたものでしょうか? もしそうなら、まずオーバーフローの処理がまずいです。 計算結果がunsigned charの範囲外になる場合があって、unsigned charの範囲内に丸めるためには、 計算結果を取りうる範囲の変数(例えばint)に入れて、丸めの処理をしたあと、 unsigned charに代入する必要があります。 RGB→YUVの時、U,Vはunsigned charだったりしませんか? unsigned charのU,Vに-128を引いた値を入れてしまうと、 layer[i+j+1]、layer[i+j+2]が128以下のときオーバーフローが発生してしまいます。 ですので、U,Vをint等にするか、 Yと同じように式中で- 128してあげる必要があります。 (これは型を指定してない整数リテラルがint型なのと、 暗黙の型変換によってintに昇格されて計算されるため、 オーバーフローが発生しなくなっています) サンプルコードです。 layerはunsigned charと仮定します。 丸め範囲はYUV,RGBともに0~255にしています。 RGB→YUV Yo, Uo, Voが出力です。 int Ys, Us, Vs; unsigned char Yo, Uo, Vo; Ys = 0.257 * layer[i+j] + 0.504 * layer[i+j+1] + 0.098 * layer[i+j+2] + 16; Us = -0.148 * layer[i+j] - 0.291 * layer[i+j+1] + 0.439 * layer[i+j+2] + 128; Vs = 0.439 * layer[i+j] - 0.368 * layer[i+j+1] - 0.071 * layer[i+j+2] + 128; if( Ys < 0 ){ Yo = 0; }else if( Ys > 255 ){ Yo = 255; }else{ Yo = Ys; } if( Us < 0 ){ Uo = 0; }else if( Us > 255 ){ Uo = 255; }else{ Uo = Us; } if( Vs < 0 ){ Vo = 0; }else if( Vs > 255 ){ Vo = 255; }else{ Vo = Vs; } YUV→RGB Ro, Go, Boが出力です。 int Y, U, V; int Rs, Gs, Bs; unsigned char Ro, Go, Bo; Y = layer[i+j] - 16; U = layer[i+j+1] - 128; V = layer[i+j+2] - 128; Rs = 1.164 * Y + 1.596 * V; Bs = 1.164 * Y + 2.018 * U; Gs = 1.164 * Y - 0.391 * U - 0.813 * V; if( Rs < 0 ){ Ro = 0; }else if( Rs > 255 ){ Ro = 255; }else{ Ro = Rs; } if( Gs < 0 ){ Go = 0; }else if( Gs > 255 ){ Go = 255; }else{ Go = Gs; } if( Bs < 0 ){ Bo = 0; }else if( Bs > 255 ){ Bo = 255; }else{ Bo = Bs; }

ringist
質問者

お礼

こんばんは! ご指摘通りunsigned charにしておりました intにして計算したところ 変換がうまくいきました。。。ご指摘鋭かったです 本当にありがとうございました!!

関連するQ&A