2012-01-23 13 views
2

特定のデータを視覚化する目的で、私は着色を利用することになっています。つまり、私が処分しているC++コードは、cairo-graphicsを使用して出力しており、関数はRGB空間に基づいています。一方、私が扱うデータは、CIELab色空間の「特定のスライス」を利用すべきです。CIELab空間のカラー出力

問題は、C++でこれを行う最も適切な方法は何でしょうか?おそらく、カイロによって提供されたRGB関数に依然として依存しているかもしれない変換(おそらく、RGBはデバイスに依存するので、この代替手段は疑わしい)でしょうか?

答えて

4

OpenCVには色変換が組み込まれています。あなたはそれらを使うことも、自分の色変換ルーチンのインスピレーションとして使うこともできます。 を参照してくださいthe doc about color conversion in OpenCV (cv::cvtColor)

それを使用する1つの可能な方法は次のようになります。

#include <cv.h> 
#include <highgui.h> 
int main() 
{ 
    cv::Mat imgRgb = cv::imread("file.bmp"); 
    cv::Mat imgLab; 
    cv::cvtColor(imgRgb, imgLab, Cv::CV_BGR2Lab); 

    //access Lab values 
    int y = 50; 
    int x = 20; 
    double L = imgLab.at<double>(y,x)[0]; //beware the order : openCV treats images as matrixes, thus the y param come first 
    double a = imgLab.at<double>(y,x)[1]; 
    double b = imgLab.at<double>(y,x)[2]; 
} 

は注意してください:私は、これはただのドラフトで、このコードをテストしたり、コンパイルできませんでした。

+0

ありがとう。私が処分したコードは、pdfファイルを生成するカイログラフィックス関数に基づいているので、あなたが提案したライブラリと一緒にCIELabの色付きpdf出力を出力する方法はありますか?そうでない場合、これを可能にするライブラリの提案は高く評価されます。 – user506901

+0

さて、pdfは画像フォーマットではありません。これは、イメージ、テキスト、フォントを含むことができるフォーマットです(そしてそのリストも続きます)。そして、いいえ、opencvはpdfファイルを扱いません。 cimgライブラリを見てみることをお勧めします。これはopencvより使いやすく、RGBtoLab変換も行っています(http://cimg.sourceforge.net/reference/structcimg__library_1_1CImg.htmlを参照)。 imagemagick(imagemagickはpdfファイルを扱う)をインストールすれば、pdfに出力することができます:http://cimg.sourceforge.net/reference/group__cimg__files__io.html –

4

私は上記のテストをまとめました。将来的には、RGBをCIELABに変換する関数があります。

#include <cv.h> 
#include <highgui.h> 
Mat BGR2CIELab(Mat const &rgb_src) 
{ 
    Mat imgLab; 
    cvtColor(rgb_src, imgLab, CV_BGR2Lab); 

    //access Lab values 
    int y = 50; 
    int x = 20; 
    Vec3d pix_bgr = imgLab.ptr<Vec3d>(y)[x]; //beware the order : openCV treats images as matrixes, thus the y param come first 
    double L = pix_bgr.val[0]; 
    double a = pix_bgr.val[1]; 
    double b = pix_bgr.val[2]; 

    return imgLab; 
} 
+0

あなたのスニペットは正常に実行されますが、L、a、bの値は0 <= L <= 100、-127 <= a <= 127、-127 <= b <= 127の制約に従わないでください。 –

+0

私はそれを今チェックすることはできませんが、それらは二重の値なので、openCVがそれらを別の形式にすることは可能です。たとえば0.0

+0

私はOpenCV 2.4.8を使用しています。コードを実行した後の結果は次のとおりです。http://i1275.photobucket.com/albums/y442/lbkhanhvu/return_zps2062d06f.jpgそれが正しいか間違っているかどうか見ることができますか? –

関連する問題