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

本文介绍了一种使用OpenCV实现的多尺度视网膜图像增强方法,该方法能够有效提升图像细节,特别是对于背景较暗的图像,通过调整不同尺度的空间滤波来改善图像质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

### 图像去雾算法概述 图像去雾算法旨在通过处理受雾霾影响的图像来恢复更清晰、真实的视觉效果。这类技术广泛应用于摄影后期处理、自动驾驶汽车视觉系统以及安防监控等领域。 #### 原理 基于大气散射模型,当光线穿过含有气溶胶颗粒的大气层时会发生散射现象,导致远处物体的颜色偏向于天空颜色并伴有对比度下降。暗通道先验理论指出,在无雾自然场景下大部分局部区域至少存在个像素使得该位置处三原色之非常接近零[^3]。利用这特性可以估计出全局大气光强度A及透射率t(x),进而计算出未被污染前的真实色彩I(x)=J(x)t(x)+A(1-t(x)),其中J表示理想状态下的景物表面辐射亮度分布函数。 #### 实现方法 对于具体的实现方式而言,有多种不同的策略可供选择: - **单尺度Retinex (SSR)** 多尺度 Retinex (MSR)[^2]:这些方法模拟人类视网膜如何感知不同光照条件的变化。通过对输入图片施加多个高斯滤波器核卷积操作获取不同空间频率响应特征图谱;随后对其进行归化处理并与源数据相乘组合成增强版输出版本。 - **暗通道先验法** :此方案假设户外风景照片里绝大多数非天空部分都存在着某些特定方向上的极低灰阶值点位——即所谓的“暗通道”。据此推断出每点对应的介质传输比例因子τ,并借助最小二乘拟合求解未知参数a(代表环境平均照度水平),最后反向重建目标影像。 以下是 Python 中使用 OpenCV 库执行简单形式 SSR 的示范代码片段: ```python import cv2 import numpy as np def single_scale_retinex(img, sigma): retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma)) return retinex image = cv2.imread('foggy_image.jpg') gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY).astype(float) ssr_result = single_scale_retinex(gray_img, 15) cv2.imshow("Single Scale Retinex", ssr_result / ssr_result.max()) cv2.waitKey(0); cv2.destroyAllWindows() ``` #### 应用领域 随着计算机视觉技术机器学习的发展,图像去雾不仅限于改善静态画质表现力方面的作用,还进步渗透到了动态视频流分析乃至实时交互式体验当中。例如,在智能交通管理系统中,摄像头采集到的画面经常受到天气状况干扰而变得难以辨认车辆牌照号码或行人轮廓细节;此时采用有效的除霾手段便显得尤为重要了。同样地,在无人机航拍作业期间遇到不利气象条件下也能依靠此类工具获得更为精确的目标识别结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知来者逆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值