プロが教えるわが家の防犯対策術!

こんにちは

OpenCVを用いてカメラに映る画像の輝度値のCr,Cb成分(画素数全体の平均を取り)を表示する
プログラムを作ろうと考えているんですが、サイトを検索していると輝度値の求め方が・・・

Y→輝度値, Cr,Cb→輝度値からそれぞれR成分,B成分を引き取ったもの
R,G,B→RGBそれぞれの値,delta→8ビット画像(128) があるとしまして

Y = 0.299*R + 0.587*G + 0.114*B
Cr = 0.5*R - 0.419*G - 0.081*B + delta
Cb = -0.169*R - 0.332*G + 0.5*B + delta



Y = 0.299*R + 0.587*G + 0.114*B (Yは同じ式)
Cr = 0.713 * (R - Y) + delta
Cb = 0.564 * (B - Y) + delta

2通りあります.どちらの式も違う値(小数部の範囲で)が出ます.
どちらが正しいCr成分,Cb成分を求める式なのでしょうか?
あるいどちらがより正確な値が求められるのでしょうか?


画像処理を始めたばかりでなので,ご教授よろしくお願い致します.

A 回答 (3件)

kmeeさんが言っているように、式の表記方法が違うだけで、YCrCb変換の式としては同じと思った方が良いと思います。



ちなみに、後半の式を展開しても
Y = 0.299*R + 0.587*G + 0.114*B
Cr = 0.499813*R - 0.41853*G - 0.08128*B + delta
Cb = -0.16864*R - 0.33107*G + 0.499704*B + delta

となり、RGBの値が0~255の場合、2通りの式の計算の差の絶対値が一番大きくても-0.23766

しかもcvCvtColorを使っているのであれば、RGBの値は入力も出力の8Bitで使っている?でしょうから、計算結果には、なんら影響はないと思います。

また、カメラで画像を撮影した時のRGBの値は、普通に2~3ぐらいはふらつくので、RGBの値が1以下の話をしても、あまり意味が無いと思います。

あえて、どちらが正確か?というと、YCrCbの定義を表している後半の式が良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

RGBの値は結構変化するのですね・・・
予想以上でした^^;

展開したらほぼ同じ式になるんですね・・・
途中計算式が難しくてどらがいいのか迷っていました。

参考にさせて頂きます。

お礼日時:2011/01/17 13:04

cvtColorでRGB→YCrCbに変換したら、3チャンネルあるうちのそれぞれのチャンネルにY,Cr,Cbが入っています。



Cr,Cbの値が欲しいなら
・cvtColorでRGB(BGR?)→YCrCbに変換
・splitでチャンネル毎に分離
http://opencv.jp/opencv-2.2/c/core_operations_on …
http://opencv.jp/opencv-2.2/cpp/core_operations_ …
で、Y,Cr,Cbそれぞれだけが入った1チャンネルの画像になります。

あるいは、RGB画像からR,G,Bをそれぞれ取り出す要領で、Y,Cr,Cbが取りだせます。
    • good
    • 0
この回答へのお礼

3チャンネルで分離ですか・・・
了解しました。時間的に実装できるかわかりませんが、やってみます。
回答ありがとうございます。

お礼日時:2011/01/17 13:05

小数部の違いというのは誤差の範囲ではないかと。



それより、OpenCVを使っているのなら
http://opencv.jp/opencv-2.2/c/imgproc_miscellane …
http://opencv.jp/opencv-2.2/cpp/imgproc_miscella …
を使えばいいのではないでしょうか。

この回答への補足

どの式も正しいのでしょうか?

cvtColorのことでしょうか?
これは使っています.
実はYCrCb変換のCrとCbの値の入手したいのです.

こちらのサイトでは後者の式を用いてますね・・・どちらが正しいのでしょうか?

補足日時:2011/01/14 21:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!