1. ホーム
  2. c++

[解決済み] RGB→YUV→RGBの変換方法(両方式)

2022-03-09 08:09:52

質問

RGBからYUVへ、YUVからRGBへ、互いに逆である一対の変換アルゴリズムが欲しいのです。 つまり、往復の変換では値が変化しないようにしなければならない。 (お望みなら、YUVをY'UV、YUV、YCbCr、YPbPrと置き換えてください)。

そのようなものは存在するのでしょうか? もしあれば、それは何ですか?

投稿ソリューション( C/C++でRGB->YUV変換を行うにはどうしたらよいでしょうか? , http://www.fourcc.org/fccyvrgb.php , http://en.wikipedia.org/wiki/YUV ) は、[0,255] へのクランプを省略した場合、逆数 (2 つの 3x3 行列は逆数) にしかなりません。 しかし、このクランプを省略すると、負の輝度のようなものができてしまい、YUV空間での画像処理に大きな支障をきたすことになります。 クランプを保持すると、変換が非線形になり、逆行列を定義するのが面倒になります。

どのように解決するのか?

はい、反転可能な変換が存在します。

エクアシスGmbH は、RGBからYUV、YCbCr、YPbPrへの反転変換と、それぞれがどのような状況に適しているかの説明、このクランプの本当の意味、そして参考文献へのリンクを掲載しています。 (良いSOの答えのように。)

私自身のアプリケーション(アナログ電圧ではなくjpg画像)にはYCbCrが適切だったので、この2つの変換のコードを書きました。 実際、多くの画像で、前後の値の差は256分の1以下であり、前後の画像は視覚的に区別できないほどでした。

PILの色空間変換 YCbCr -> RGB は、equasysのWebページを紹介したことでクレジットが得られます。

その他の回答は、equasysの正確さと簡潔さを向上させることができたかどうか疑わしいものです。

  • https://code.google.com/p/imagestack/ には、rgb_to_x と x_to_rgb が含まれています。 関数がありますが、コンパイルとテストはしていません。

  • Cory Nelsonの回答は似たような関数のコードにリンクしていますが、それによると の反転は一般に不可能であり、equasysと矛盾する。

  • FFmpeg、OpenCV、VLFeat、または ImageMagick のソースコードです。

2019年 編集 コメントで紹介したgithubのC言語コードです。

void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B)
{
  Y =  0.257 * R + 0.504 * G + 0.098 * B +  16;
  U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
  V =  0.439 * R - 0.368 * G - 0.071 * B + 128;
}
void RGBfromYUV(double& R, double& G, double& B, double Y, double U, double V)
{
  Y -= 16;
  U -= 128;
  V -= 128;
  R = 1.164 * Y             + 1.596 * V;
  G = 1.164 * Y - 0.392 * U - 0.813 * V;
  B = 1.164 * Y + 2.017 * U;
}