在opencv中将三个灰度[R,G,B]图像合并为单色图像

Posted

技术标签:

【中文标题】在opencv中将三个灰度[R,G,B]图像合并为单色图像【英文标题】:Merging three grayscale [R, G, B] images into a single color image in opencv 【发布时间】:2013-04-04 20:39:07 【问题描述】:

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

但我仍然无法恢复彩色图像。结果图像仍然是灰度的

我做错了什么?如何恢复我的彩色图像?

【问题讨论】:

您的 PNG 文件是否确定为灰度编码,而不是只有灰色像素的 RGB 图像?在进行合并之前,我会尝试使用 OpenCV 将 R、G 和 B 转换为灰度。 是的,绝对是灰度单通道图像, 【参考方案1】:

我看不出您的代码有什么问题。我怀疑它可能是源数据,或者进口商如何处理它。加载图像后,是否可以打印出图像元数据以查看 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

【讨论】:

恭喜 - 我在 SO 上找到的最佳答案之一。【参考方案2】:

一种方法是使用 cvtColor 从一个通道创建彩色图像,然后使用 at 在循环中逐像素替换其他两种颜色功能。可能有一种方法可以使用矩阵运算符更轻松地做到这一点,但我对 openCV 还不够熟悉,无法确定。

【讨论】:

抱歉,那将是一种非常低效且缓慢的方法。 cv::merge() 函数旨在以优化的方式实现这一点。

以上是关于在opencv中将三个灰度[R,G,B]图像合并为单色图像的主要内容,如果未能解决你的问题,请参考以下文章

图片灰度化

在 ImageMagick 命令行中将 RGB 转换为灰度

OpenCV:如何计算最大值(R,G,B)

转变为灰度图像的算法优化及马赛克实现代码

Opencv利用Mat访问像素值

Opencv图像色彩空间与通道