【问题标题】:OpenCV - How to convert grayscale to color (CV_8UC3)?OpenCV - 如何将灰度转换为彩色(CV_8UC3)?
【发布时间】:2020-04-25 05:08:05
【问题描述】:

我正在尝试将两个 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;

src1 和 src2 具有相同的类型,即 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;

它不起作用。因为src2 和src3 都有0 类型,即CV_8U。但我希望src3 具有16 类型,即CV_8UC3(根据here)。这段代码带来了这个错误:

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

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

【问题讨论】:

  • 灰度图像不包含颜色信息。你怎么知道什么颜色映射到什么灰色调?
  • @JesperJuhl 这是真的。但我希望src3 成为CV_8UC3,以便可以使用src1 添加它。即使我将src3 初始化为CV_8UC3 也不起作用。

标签: c++ opencv colors type-conversion


【解决方案1】:

您无法通过调用convertTo 更改频道数量。根据reference:

所需的输出矩阵类型,或者更确切地说,自数量以来的深度 渠道与输入相同;如果 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,您可以转换存储值的数据类型,例如从整数到浮点数。

【讨论】:

  • 或者你就用cvtColor:cv::cvtColor(src2, src2, cv::COLOR_GRAY2BGR);。
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多