OpenCV - 如何将灰度转换为彩色(CV_8UC3)?

OpenCV - How to convert grayscale to color (CV_8UC3)?

本文关键字:CV 8UC3 彩色 转换 灰度 OpenCV      更新时间:2023-10-16

我正在尝试将两个 Mat 对象添加到一起,但我遇到了一个错误。

这是工作代码:

Mat src1, src2, dst;
/// Read image ( same size, same type )
src1 = imread("lion.png");
src2 = imread("bluebell.png");
dst = src1 + 0.5 * src2;
imshow("Blend", dst);
waitKey(0);
return 0;

src1src2具有相同的类型,即CV_8UC3。但是当我尝试这个时:

Mat src1, src2, src3, dst;
/// Read image
src1 = imread("lion.png");
src2 = imread("bluebell.png", IMREAD_GRAYSCALE);
src2.convertTo(src3, COLOR_GRAY2RGB);
cout << "src1.type " << src1.type() << endl;
cout << "src2.type " << src2.type() << endl;
cout << "src3.type " << src3.type() << endl;
dst = src1 + 0.5 * src3;
imshow("Blend", dst);
waitKey(0);
return 0;

它不起作用。因为src2src3都有CV_8U0类型。但我希望src3CV_8UC3的类型16(根据这里(。此代码带来此错误:

OpenCV 错误:输入参数的大小不匹配(该操作既不是 cv::arithm_op 中的"数组操作数组"(其中数组具有相同的大小和相同的通道数(,也不是"数组操作标量",也不是"标量操作数组"(

如何将灰度图像转换为具有确切CV_8UC3类型的彩色图像?

不能通过调用convertTo来更改通道数。根据参考资料:

所需的输出矩阵类型,或者更确切地说,深度,因为通道与输入相同;如果 rtype 为负,则 输出矩阵的类型将与输入相同。

当您有一个灰度通道的矩阵时,您可以使用cv::merge通过将BGR通道的这个组件放在新矩阵中来创建3通道图像:

src1 = imread("lion.png");
src2 = imread("bluebell.png", IMREAD_GRAYSCALE);    // one channel
cv::merge(std::vector<cv::Mat>{src2, src2, src2}, src2);
// blue, green,red    as output 3-channels mat
dst = src1 + 0.5 * src2;

通过调用convertTo,可以将存储值的数据类型(例如从整数转换为浮点数(。