将单通道图像转换为 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的主要内容,如果未能解决你的问题,请参考以下文章