将单通道图像转换为 3 通道图像 C++ / OpenCV

Posted

技术标签:

【中文标题】将单通道图像转换为 3 通道图像 C++ / OpenCV【英文标题】:Convert single channle image to 3 channel image C++ / OpenCV 【发布时间】:2010-09-01 00:16:57 【问题描述】:

我正在使用 openCV C++

我需要将单通道图像转换为 3 通道图像。所以我可以使用这个:cvCvtColor(result,gray,CV_BGR2GRAY);

我不能这样做,因为结果 img 是单通道图像。有什么想法吗?

【问题讨论】:

【参考方案1】:

您应该使用CV_GRAY2BGR 而不是CV_BGR2GRAY

【讨论】:

这给了我同样的错误:cvCvtColor 中的通道数错误(此转换代码的通道数不正确) 您还必须更改前两个参数的顺序:cvCvtColor(gray, result, CV_GRAY2BGR)。仔细阅读文档:void cvCvtColor(const CvArr* src, CvArr* dst, int code);【参考方案2】:

我在 OpenCV 参考书中查看了 cvtColor,发现了这个:

C++:void cvtColor(InputArray src, OutputArray dst, int code, int dstCn =0)

dstCn – 目标图像中的通道数。如果参数为0,则通道数由src和code自动推导出来。

我用过

cvtColor(src,gray,CV_BGR2GRAY,1);

将 3 通道的 Mat 转换为 1 通道,并且成功了。因此将 dstCn 更改为 3 可能对您有用:)

【讨论】:

【参考方案3】:

试试这个:

CvSize dim = cvSize(int width, int height);
IplImage* dst = cvCreateImage( dim, 8, 3 );
IplImage* gray = cvCreateImage(dim, 8, 1);
// Load the gray scale image
cvMerge(gray , NULL, NULL, NULL, dst);
cvShowImage("gray",gray);
cvShowImage("dst",dst);
cvWaitKey(0);

dst 和 gray 的数据类型必须相同。您不能简单地将浮点数合并到 uint 矩阵中。为此,您必须使用 cvScale。

【讨论】:

小心使用 IplImage,它现在已被弃用。【参考方案4】:

尝试将 gray,gray,gray 合并为 BGR。

【讨论】:

我不知道怎么做? cvMerge(grey, grey, grey, NULL, final); 不工作。 @rptwsthi:这里没有使用 cvMerge 函数。尝试一些矩阵操作。关键是将2个相同的矩阵复制到原始的灰色矩阵,并将它们存储为好像有3个通道。【参考方案5】:

您可以创建一个相同通道的向量,然后将它们合并,如下所示:

std::vector<cv::Mat> copiesmat,mat,mat;  
cv::merge(copies,mat);

【讨论】:

【参考方案6】:

恕我直言: 如果输入是灰色的,那么输出将是灰色的。你能得到的最好的是基于像素数据的彩色分布式图像,比如(110, 110, 110) 的像素数据110,而不是真正的彩色图像

【讨论】:

以上是关于将单通道图像转换为 3 通道图像 C++ / OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIL 将 1 通道图像转换为 3 通道?

将通道最后转换为通道第一图像

二值化之后的图像为单通道,那么还能转换为多通道吗

Numpy:跨越多通道图像

python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波

matlab 图像和 opencv 图像的相互转换