OpenCV 3.0に果敢に挑戦し続けてみる

個人的な趣味の一環として、OpenCV 3.0がらみの情報をまとめてみる。「引用はいぃんよー、無断転載はあかんよー」ということで。

一つだけ言える真理がある。「男は黒に染まれ」(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 をリサイズして利用 )

f:id:anobiidae:20140302212957p:plain

 

decolor

f:id:anobiidae:20140302213246j:plain

 

平均値 Y ← (R + G + B ) / 3

f:id:anobiidae:20140302213304j:plain

 

cvtColor(COLOR_BGR2GRAY) 

Y ← 0.299 * R + 0.587 * G + 0.114 * B(NTSC)

f:id:anobiidae:20140302213313j:plain

 

 

cvtColor(COLOR_BGR2Lab) → L成分のみ抽出

f:id:anobiidae:20140302213359j:plain

 

 ソースコードは以下

#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);
        }
}