簡體   English   中英

將三個灰度[R,G,B]圖像合並為opencv中的單色圖像

[英]Merging three grayscale [R, G, B] images into a single color image in opencv

我有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);

但顯然,它僅適用於只有一個通道的源圖像。 我通過了我的一張灰度圖像:

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

但我仍然無法獲得彩色圖像。 得到的圖像仍然是灰度的

我究竟做錯了什么 ? 如何恢復我的彩色圖像?

我看不出你的代碼有什么問題。 我懷疑它可能是源數據,或者它是如何被進口商處理的。 加載圖像后,是否可以打印出圖像元數據以查看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順序(默認)。 我在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

一種方法是使用cvtColor從一個通道創建彩色圖像,然后使用at函數在循環中逐個像素地替換另外兩種顏色。 對於矩陣運算符,可能有一種方法可以更輕松地完成此操作,但我對openCV不太熟悉,無法確切知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM