OpenCV图像增强(一)——多尺度视网膜增强

前言

1.在处理摄像头时,或者在图像中物体轮廓提取时,常常会碰到一些背景偏暗的图像,为了更好的得到效果,那么图像增强会是一个不错的选择。
2.我这里使用的库OpenCV版本是3.30,关于opencv学习,有兴趣的看我之前发的博客,可以加之前博客后面给的兴趣群。
🔥计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,远程协助,代码定制,私聊会回复!
✍🏻作者简介:机器学习,深度学习,卷积神经网络处理,图像处理
🚀B站项目实战:https://space.bilibili.com/364224477
😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+
🤵‍♂代做需求:@个人主页

代码演示

1.代码

/*多尺度视网膜增强*/
//第一个参数输入的原始图像
//第二参数输出的图像
//第三个参数
void multiScaleRetinex(const Mat &src, Mat &dst)
{
    //增强尺度
    int gain = 128;
    int offset = 128;
    
    Mat dst_log, dst_f, res_f;

    vector<double> sigemas;
    vector<double> weights;
    for (int i = 0; i < 3; i++)
    {
       weights.push_back(1.f / 3);
    }
    sigemas.push_back(30);
    sigemas.push_back(150);
    sigemas.push_back(300);

    //转换数据
    src.convertTo(dst_f, CV_32FC3);
    //对数变换
    log(dst_f, dst_log);

    //根据给定的权重归一化
    double weight = 0;
    size_t num = weights.size();
    for (size_t i = 0; i < num; i++)
    {
        weight += weights[i];
    }

    if (weight != 1.0f)
    {
        dst_log *= weight;
    }

    //过滤
    for (size_t i = 0; i < num; i++)
    {
        Mat blur = dst_f.clone();
        gaussianFilter(blur, sigemas[i]);
        log(blur, res_f);

        //计算加权差
        res_f *= weights[i];
        dst_log -= res_f;
    }

    
    dst = (dst_log * gain) + offset;
    dst.convertTo(dst, CV_8UC3);
}

//高斯滤波
void gaussianFilter(Mat &img, double sigma)
{
    int filter_size;

    //不能大于300,大于300强行改成300
    if (sigma > 300)
    {
        sigma = 300;
    }

    //获取滤波器的大小,转为奇数
    filter_size = (int)floor(sigma * 6) / 2;
    filter_size = filter_size * 2 + 1;

    //如果小于3则返回
    if (filter_size < 3)
    {
        return;
    }

    //高斯模数
    GaussianBlur(img, img, cv::Size(filter_size, filter_size), 0);
}

2.运行效果
在这里插入图片描述
在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐