在 OpenCV 中合并频道

Posted

技术标签:

【中文标题】在 OpenCV 中合并频道【英文标题】:Merging channels in OpenCV 【发布时间】:2013-01-29 11:41:49 【问题描述】:

我需要从灰度图像创建“红色”图像。我正在使用此代码:

void build_red(const cv::Mat& in, cv::Mat& out) 
    out = Mat::zeros(in.rows, in.cols, CV_8UC1);

    Mat zeros = Mat::zeros(in.rows, in.cols, CV_8UC1);
    Mat tmp;
    in.convertTo(tmp, CV_8UC1);

    vector<Mat> ch;
    ch.push_back(zeros);
    ch.push_back(zeros);
    ch.push_back(tmp);

    cout << "Using " << ch.size() << " channels" << endl;
    merge(ch, out);
 // build_red

加上一些解释:

void build_red(const cv::Mat& in, cv::Mat& out) 

in 是输入矩阵,out 是输出。

out = Mat::zeros(in.rows, in.cols, CV_8UC1);

为 out 分配一些空间(可能没用,但我尝试的一部分)

    Mat zeros = Mat::zeros(in.rows, in.cols, CV_8UC1);
    Mat tmp;
    in.convertTo(tmp, CV_8UC1);

创建一个大小相同的空矩阵,并将输入图像转换为单通道uchar。

    vector<Mat> ch;
    ch.push_back(zeros);
    ch.push_back(zeros);
    ch.push_back(tmp);

    cout << "Using " << ch.size() << " channels" << endl;
    merge(ch, out);

创建一个具有三个通道的向量,然后将它们合并到“输出”中。

但是,当我运行代码时,我收到以下消息:

     Using 3 channels

还有以下例外:

OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) 
in cvConvertImage, file /[...]/libs/OpenCV-2.4.0/modules/highgui/src/utils.cpp, 
line 611
terminate called after throwing an instance of 'cv::Exception'
what():  /[...]/libs/OpenCV-2.4.0/modules/highgui/src/utils.cpp:611: 
error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage

你能帮帮我吗?以我的经验来看,图像的类型是相同的,通道数是正确的。

【问题讨论】:

输出图像应该是三通道。试试:out = Mat::zeros(in.rows, in.cols, CV_8UC3); 函数运行完美。如果输入是 3 通道图像,我只会收到指定的错误。确保输入为 1 通道,输出为 3 通道图像。 你确定是你提供的函数抛出了异常吗? 【参考方案1】:

如果您有灰度图像,为什么要转换图像?

只需为蓝色和绿色创建两个相同大小的空矩阵。

您已将输出矩阵定义为 1 通道矩阵。您的输出矩阵必须至少包含 3 个通道。 (蓝色、绿色和红色)。蓝色和绿色将完全为空,您将灰度图像作为输出图像的红色通道。

#include <opencv2/highgui/highgui.hpp> 
#include <stdio.h>
using namespace std;
using namespace cv;

int main()

    Mat img, g, fin_img;
    img = imread("Lenna.png",CV_LOAD_IMAGE_GRAYSCALE);
    vector<Mat> channels;

    g = Mat::zeros(Size(img.rows, img.cols), CV_8UC1);

    channels.push_back(g);
    channels.push_back(g);
    channels.push_back(img);

    merge(channels, fin_img);
    imshow("img", fin_img);
    waitKey(0);
    return 0;

【讨论】:

如果你有 YUV 和 I420 中的子样本色度平面怎么办

以上是关于在 OpenCV 中合并频道的主要内容,如果未能解决你的问题,请参考以下文章

在 calchist opencv 中选择频道

javaopencv模板匹配多个

如何在 Python 中使用 OpenCV 合并 2 个灰度图像

在 OpenCV 中合并两个 Mat-Objects

将白色像素区域合并为单个区域opencv c ++

使用opencv将图像从BGR转换为ARGB