c++ - 从像素标签创建 RGB 图像

标签 c++ opencv image-processing

给定一个 CV_32SC1 cv::Mat 图像,其中包含每个像素的标签(其中标签只是 0..N-1 中的索引),什么OpenCV 中生成 CV_8UC3 图像的最简洁代码是用不同的任意颜色显示每个连接的组件吗?如果我不必像 cv::floodFill 那样手动指定颜色,那就更好了。

最佳答案

如果最大标签数为256,则可以使用applyColorMap ,将图像转换为 CV_8U:

Mat1i img = ...

// Convert to CV_8U
Mat1b img2;
img.convertTo(img2, CV_8U);

// Apply color map
Mat3b out;
applyColorMap(img2, out, COLORMAP_JET);

如果标签数量高于256,则需要自己做。下面是一个生成 JET 颜色图的示例(它基于 jet 函数的 Matlab 实现)。然后您可以为矩阵的每个元素应用颜色图。

请注意,如果您想要不同的颜色图,或随机颜色,您只需修改 //Create JET colormap 部分:

#include <opencv2/opencv.hpp>
#include <algorithm>
using namespace std;
using namespace cv;

void applyCustomColormap(const Mat1i& src, Mat3b& dst)
{
    // Create JET colormap

    double m;
    minMaxLoc(src, nullptr, &m);
    m++;

    int n = ceil(m / 4);
    Mat1d u(n*3-1, 1, double(1.0));

    for (int i = 1; i <= n; ++i) { 
        u(i-1) = double(i) / n; 
        u((n*3-1) - i) = double(i) / n;
    }

    vector<double> g(n * 3 - 1, 1);
    vector<double> r(n * 3 - 1, 1);
    vector<double> b(n * 3 - 1, 1);
    for (int i = 0; i < g.size(); ++i)
    {
        g[i] = ceil(double(n) / 2) - (int(m)%4 == 1 ? 1 : 0) + i + 1;
        r[i] = g[i] + n;
        b[i] = g[i] - n;
    }

    g.erase(remove_if(g.begin(), g.end(), [m](double v){ return v > m;}), g.end());
    r.erase(remove_if(r.begin(), r.end(), [m](double v){ return v > m; }), r.end());
    b.erase(remove_if(b.begin(), b.end(), [](double v){ return v < 1.0; }), b.end());

    Mat1d cmap(m, 3, double(0.0));
    for (int i = 0; i < r.size(); ++i) { cmap(int(r[i])-1, 2) = u(i); }
    for (int i = 0; i < g.size(); ++i) { cmap(int(g[i])-1, 1) = u(i); }
    for (int i = 0; i < b.size(); ++i) { cmap(int(b[i])-1, 0) = u(u.rows - b.size() + i); }

    Mat3d cmap3 = cmap.reshape(3);

    Mat3b colormap;
    cmap3.convertTo(colormap, CV_8U, 255.0);


    // Apply color mapping
    dst = Mat3b(src.rows, src.cols, Vec3b(0,0,0));
    for (int r = 0; r < src.rows; ++r)
    {
        for (int c = 0; c < src.cols; ++c)
        {
            dst(r, c) = colormap(src(r,c));
        }
    }
}

int main()
{
    Mat1i img(1000,1000);
    randu(img, Scalar(0), Scalar(10));

    Mat3b out;
    applyCustomColormap(img, out);

    imshow("Result", out);
    waitKey();

    return 0;
}

关于c++ - 从像素标签创建 RGB 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993895/

相关文章:

c++ - qmake 仅在 Debug模式下运行命令,如何?

python - 使用 pybind11 嵌入 python。虚拟环境不行

python - "ImportError: DLL load failed: The specified module could not be found"进行对象检测时出现此错误

c - C 中的 OpenCV - 绘制一个应该只出现在图像上半部分的圆圈?

python - 在包含许多对象的图像中查找对象 (Python)

python - 如何使用 Scikit-image 将透明的 png 图像与另一个图像合并

c++ - 无法找到过程入口点

不同 block 中的 C++ 变量

c++ - 找不到 OpenCV haarcascade_frontalface_alt.xml

python - 使用自定义字体的 Pytesseract 错误地对数字进行分类