一つだけ言える真理がある。「男は黒に染まれ」(OpenCV 3.0.0-dev decolorを使って見る)
実質、グレイスケールなんで灰色とか白とかあるんですけどね。
さて、OpenCVでグレイスケール化としては、cv::cvtColor(dst,src,BGR2GRAY); とかが主流だと思うのですが、今回photo moduleの下にdecolorという関数が追加されたのでそれを試して見ました。代表的な変換手段と比較しつつ。
http://docs.opencv.org/trunk/modules/photo/doc/decolor.html
にはアルゴリズムの詳細は記載なしか(白目)
元画像( http://upload.wikimedia.org/wikipedia/commons/6/66/SMPTE_Color_Bars.svg をリサイズして利用 )
decolor
平均値 Y ← (R + G + B ) / 3
cvtColor(COLOR_BGR2GRAY)
Y ← 0.299 * R + 0.587 * G + 0.114 * B(NTSC)
cvtColor(COLOR_BGR2Lab) → L成分のみ抽出
ソースコードは以下
#include <opencv/cv.hpp> int main(){ cv::Mat src = cv::imread("672px-SMPTE_Color_Bars.svg_320.png"); cv::Mat grayscale; cv::Mat color_boost; { cv::decolor(src,grayscale,color_boost); cv::imwrite("gray_decolor.jpg",grayscale); cv::imwrite("color_boost.jpg",color_boost); } { cv::cvtColor(src,grayscale,CV_BGR2GRAY); cv::imwrite("gray_with_cvtColor.jpg",grayscale); } { cv::Mat lab; cv::cvtColor(src,lab,CV_BGR2Lab); std::vector < cv::Mat > channels; cv::split(lab, channels ); cv::imwrite("gray_from_lab.jpg", channels.at(0) ); } { cv::Mat srcF32, dstF32 ; src.convertTo(srcF32, CV_32F); std::vector < cv::Mat > channels; cv::split(srcF32, channels ); dstF32 = (channels[0] + channels[1] + channels[2] ) / 3.0; cv::Mat dst; dstF32.convertTo(dst, CV_8U); cv::imwrite("gray_average.jpg", dst); } }