0

良い一日!

OpenCV でやりたいことを表す適切な用語が見つからないようです。状況は次のとおりです。

グレースケールの画像と色 (BGR) があります。

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

私の最初の思考プロセスは次のとおりでした。

  1. BGRカラーをLuvに変換
  2. グレースケール イメージから L を置換
  3. 最終画像を BGR に変換して保存

これは私がこれまでに行ったことです:

        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)どこが悪いの?

4

1 に答える 1

0

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

LUV イメージを Mats のベクトルに split() するのがおそらく最も簡単でしょう。

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

これにより、ベクター内に 3 つの単一チャンネルのマット L、U、および V が得られます。

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

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

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

于 2016-04-18T22:17:38.197 に答える