6

分割機能を使用して作成した 3 つのグレースケール画像があります。ここで、カラー画像を再生成したいと思います。次のコードを試しましたが、うまくいきませんでした。得られた結果の画像はまだグレースケールでした。

        cv::Mat R = cv::imread("/home/r/secret_R.png",0);
        cv::Mat G = cv::imread("/home/r/secret_G.png",0);
        cv::Mat B = cv::imread("/home/r/secret_B.png",0);
        std::vector<cv::Mat> array_to_merge;
        array_to_merge.push_back(R);
        array_to_merge.push_back(G);
        array_to_merge.push_back(B);
        cv::Mat color;
        cv::merge(array_to_merge, color);

それで、 cvtColor 関数を試しました:

        cv::Mat color_converted;
        cv::cvtColor(color, color_converted, CV_GRAY2BGR);
        cv::imwrite("/home/r/color_secret.png",color_converted);

しかし、どうやら、単一のチャネルしか持たないソース イメージに対してのみ機能します。グレースケール画像の 1 つを渡しました。

cv::cvtColor(R, color_converted, CV_GRAY2BGR);

しかし、それでもカラー画像を取り戻すことはできませんでした。結果の画像はまだグレースケールでした

私は何を間違っていますか?カラー画像を元に戻すにはどうすればよいですか?

4

2 に答える 2

15

あなたのコードに問題はありません。ソースデータか、インポーターによる処理方法の可能性があると思います。画像を読み込んだ後、画像のメタデータを出力して、OpenCV が読み取っている属性を確認できますか? それらはすべて同じ寸法で、単一のチャンネルを持つ必要があります。

std::cout << "Red:   " << R.size().width << " x " << R.size().height << " x " << R.channels() << std::endl;
std::cout << "Green: " << G.size().width << " x " << G.size().height << " x " << G.channels() << std::endl;
std::cout << "Blue:  " << B.size().width << " x " << B.size().height << " x " << B.channels() << std::endl;

ヘッダーとメインを追加して、プログラムを実行しました。B、G、R の順序 (デフォルト) でマージするように、小さな変更を 1 つ加えました。Mac OS X 10.8でコンパイルしました:

g++ -o merge merge.cpp -lopencv_core -lopencv_highgui

OpenCV バージョン 2.4.3 に対して。

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

int main(int argc, char* argv[])
{
    cv::Mat R = cv::imread("chan_dest_red.png", 0);
    cv::Mat G = cv::imread("chan_dest_green.png", 0);
    cv::Mat B = cv::imread("chan_dest_blue.png", 0);

    std::vector<cv::Mat> array_to_merge;

    array_to_merge.push_back(B);
    array_to_merge.push_back(G);
    array_to_merge.push_back(R);

    cv::Mat color;

    cv::merge(array_to_merge, color);

    imwrite("merged.png", color);

    return 0;
}

別のプロジェクトからの単一チャネル画像をいくつかファイルに分割していましたが、それらを単一のカラー画像にマージしたところ、問題なく動作しました。ソースファイル情報は次のとおりです。

Red:   500 x 333 x 1
Green: 500 x 333 x 1
Blue:  500 x 333 x 1
于 2013-04-05T02:32:04.233 に答える