前へ[ OpenCV で IPP を使う ]
[ 透過情報の含まれている PNG から透過情報を取り出す ]
次へ 
マニュアルには、さらっと書いてあるけれども、実はよくよく注意しないと意図通りの変換が行われないのが落とし穴です。
大前提として cvCvtColor は、入力と出力の型が同じでなければなりません。RGB2Lab をするときでも、それは当てはまります。
RGB では次の値の範囲として表現されていることが期待されています。
IPL_DEPTH_8U => 0 -- 255
IPL_DEPTH_16U => 0 -- 65535
IPL_DEPTH_32F => 0 -- 1.0
IPL_DEPTH_8U の場合。通常 highgui の cvLoadImage() を使って jpg を読み込むとこれになります。順番は BGR です。
これをこのまま入力として使うと、cvCvtColor の出力も IPL_DEPTH_8U になります。
CV_BGR2Lab で変換するときも例外ではなく、L*a*b* の値の解釈が必要です。変形した値が入っています。
IPL_DEPTH_32F の場合は出力も IPL_DEPTH_32F で、L*a*b* もストレートな値が得られます。
python で表現するとこんな感じ。
#----------
import opencv as cv
import opencv.highgui as gui
bgr_u=gui.cvLoadImage('RIMG0689.JPG')
bgr_f=cv.cvCreateImage(cv.cvGetSize(bgr_u), cv.IPL_DEPTH_32F, 3)
cv.cvConvertScale(bgr_u, bgr_f, 1.0/255.0, 0)
lab_u=cv.cvCreateImage(cv.cvGetSize(bgr_u), cv.IPL_DEPTH_8U, 3)
lab_f=cv.cvCreateImage(cv.cvGetSize(bgr_f), cv.IPL_DEPTH_32F, 3)
cv.cvCvtColor(bgr_u, lab_u, cv.CV_BGR2Lab)
cv.cvCvtColor(bgr_f, lab_f, cv.CV_BGR2Lab)
print lab_f[0][0]
print lab_u[0][0][0]*100/255.0, lab_u[0][0][1]-128, lab_u[0][0][2]-128
#----------
やってみるとわかりますが、計算誤差は相当あって、結果がかなり食い違います。
まぁ、JPG ファイルの RGB 値と変換式の値とでキャリブレーションされていないと、L*a*b* 値自体の信頼性は低いことは仕方がありませんけれど。
BGR2Lab の変換では、できれば IPL_DEPTH_32F で変換することをお勧めしたいところ。