2016-04-18 11 views
0

おはよう!OpenCV再着色

私はOpenCVでやりたいことについて正しい言葉を見つけることができないようです。状況は次のとおりです。

私はグレースケール画像と色(BGR)を持っています。

私はグレースケール画像に色を適用したいが、輝度を維持して後で保存したい。

私の元の思考プロセスをした

  1. マブラヴ
  2. にBGRの色を変換するには、これは私が「とは何であるBGRに最終的な画像に変換し、

を保存

  • グレースケール画像からLを交換してください今まで行ったこと:

     cv::Mat pixelColor(1, 1, CV_8UC3, cv::Scalar(0)); 
         pixelColor.at<cv::Vec3b>(1, 1) = cv::Vec3b(128, 255, 0); // currently hard-coded but it actually comes from another source 
         cv::cvtColor(pixelColor, pixelColor, CV_BGR2Luv); 
         pixelColor.at<cv::Vec3b>(1, 1)[0] = image.at<unsigned char>(y, x); 
         cv::cvtColor(pixelColor, pixelColor, CV_Luv2BGR); 
    

    グレースケール画像のすべてのyとxに対して繰り返し処理を行います。実際の色は他の場所にありますが、BGRであることが保証されています。

    私の質問は次のとおりです。(1)このプロセスの適切な用語は何ですか? (2)どこが間違っていますか?

  • +0

    これはどのように機能しているのですか?あなたが受け取っているエラーを指定するのに失敗します。 –

    +0

    エラーではなく、色のスペクトル全体が適切に配置されているわけではありません。私の特定のケースでは、私は3色を使ったグレースケール画像です。色彩化の基準は、私がすでに計算した確率測定フィールドから来ます。色空間によっては、3色のうち2色しか適切に配置されません。 –

    答えて

    0

    このプロセスをチャネルスワッピングまたはチャネル置換と呼ぶことができますか?イメージ内のピクセルを明示的に反復処理する必要はありません。

    おそらく、LUVイメージをMatsのベクターに分割するのが最も簡単です。

    vector<Mat> channels; 
    cv::split(LUVMAT,channels); 
    

    これは、ベクターに3つの単一チャンネルのMats L、U、Vを与えます。

    次に、標準ベクトル操作を使用して、ベクトルの 'L'マットをグレースケール(シングルチャネル)マットに置き換えます。最後に、結果を3チャンネルのマットにマージします。

    Mat newLuma; 
    cv::merge(temp,newLuma); 
    

    次に、「newLuma」をBGRに戻します。

    +0

    私はそれを試みます!それは非常に論理的であるようです。私はピクセルごとにそれをやっている理由は、確率フィールド(前回実行で計算された)に基づいて選択するからです。 –

    +0

    それは動作します!ありがとう! –

    関連する問題