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

前言

1.在处理摄像头时,或者在图像中物体轮廓提取时,常常会碰到一些背景偏暗的图像,为了更好的得到效果,那么图像增强会是一个不错的选择。
2.我这里使用的库OpenCV版本是3.30,关于opencv学习,有兴趣的看我之前发的博客,可以加之前博客后面给的兴趣群。

代码演示

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.运行效果
在这里插入图片描述
在这里插入图片描述

发布了79 篇原创文章 · 获赞 45 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/matt45m/article/details/96132899