Opencv 基本操作二 实现label2rgb,将灰度图转化为彩色图

语义分割得到的图片都是灰度图,不利于查看分割效果,通过对label值进行三次线性变化,可以分别得到关于R、G、B三个通道的伪彩色,然后生成一副伪彩色图像。也可以通过LUT函数设置颜色查找表,得的RGB图像。下面分享两种实现方式。

方式一、线性变化

具体代码如下所示:针对不同class_num的label数据集,只需要调整代码里面的class_num即可

cv::Mat set_color(cv::Mat label) {
    int class_num = 8;//一个有8个类别
    int color_setp = int(255 / class_num);
    cv::Mat tmp,bg;
    label.copyTo(tmp);
    //把背景置成白色
    //把图像中大于0的部分全部赋值为0,小于等于0的部分赋值为255
    threshold(tmp, bg, 0, 255, THRESH_BINARY_INV);

    cv::Mat G = (class_num - label) * color_setp;
    cv::Mat R = label * color_setp;
    cv::Mat B = (R + G) / 2;
    B.convertTo(B, CV_8UC1);

    //让背景是白色的
    vector<cv::Mat> mv;
    mv.push_back(R + bg);
    mv.push_back(G + bg);
    mv.push_back(B + bg);

    cv::Mat RGB;
    cv::merge(mv, RGB);
    return RGB;
}

生成的伪彩色图像效果如图1所示,背景是白色的。

图1 生成的伪彩色图像

方式二、自定义LUT

Mat applyCustomColorMap2(Mat im_gray)
{
    //创建RGB格式的颜色对应表
    unsigned char rgb[256][3] = {
        {255,255,255},
        {0,0,255},
        {0,153,0},
        {0,92,0},
        {160,160,164},
        {96,96,96},
        {128,0,0},
        {255,0,0},
        {0,255,0},
    };
    Mat lut = Mat(256, 1, CV_8UC3, rgb); // 创建查找表
    cvtColor(lut, lut, COLOR_RGB2BGR);//将RGB格式的颜色查找表转换为BGR格式

    //将传入的灰度图转换为彩色图
    cv::Mat im_p_color;
    cvtColor(im_gray.clone(), im_p_color, COLOR_GRAY2BGR);

    //为im_p_color设置颜色
    Mat im_color;
    LUT(im_p_color, lut, im_color);
    return im_color;
}

cv::Mat im = cv::imread(fname, 0);//, cv::ImreadModes::IMREAD_COLOR
Mat im_color = applyCustomColorMap(im);
imshow("Pseudo Colored Image", im_color);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里鹏程转瞬至

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值