基于多尺度视网膜增强图像去雾算法(MSR,Multi-Scale Retinex),Matalb实现

        博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码/项目合作可以联系(QQ:3249726188

        个人主页:Matlab_ImagePro-CSDN博客

        原则:代码均由本人编写完成,非中介,提供有偿Matlab算法代码编程服务,不从事不违反涉及学术原则的事。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        本次分享的是基于多尺度视网膜增强图像去雾算法(MSR,Multi-Scale Retinex),用matlab实现。(有疑问或者想交流细节的QQ:3249726188

        一、简述一下算法情况

        Retinex理论主要包含了两个方面的内容:物体的颜色是由物体对长波、 中波和短波光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照 非均匀性的影响,具有一致性 。 根据Retinex理论,人眼感知物体的亮度取决于环境的照明和物体表面对照射光的反射,其数学表达式为:

            I(x,y)=L(x,y)*R(x,y)                            (2-1)

  式中: I(x,y)代表被观察或照相机接收到的图像信号;L(x,y)代表环境光的照射分量 ;R(x,y)表示携带图像细节信息的目标物体的反射分量 。

        将(2-1)式两边取对数,则可抛开入射光的性质得到物体的本来面貌,即有关系式 :

            Log[R(x,y)] = Log[I(x,y)]-Log[L(x,y)];                      (2-2)

        把这个技术运用到图像处理上,就是针对我们现在已经获得的一副图像数据I(x,y),计算出对应的R(x,y),则R(x,y)认为是增强后的图像,现在的关键是如何得到L(X,Y)。Retinex理论的提出者指出这个L(x,y)可以通过对图像数据I(x,y)进行高斯模糊而得到。

        因此这个算法的细路就很简单了,具体步骤如下:

        1、输入: 原始图像数据I(x,y),尺度(也就是所谓的模糊的半径)

        2、处理:(1) 计算原始图像按指定尺度进行模糊后的图像 L(x,y);

              (2) 按照2-2式的计算方法计算出 Log[R(x,y)]的值。

              (3) 将 Log[R(x,y)]量化为0到255范围的像素值,作为最终的输出。

        以上算法所实现的过程通常倍称作为SSR(Single Scale Retinex,单尺度视网膜增强)。为了得到更好的效果,开发出所谓的多尺度视网膜增强算法(MSR, Multi-Scale Retinex),最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。总的来说,MSR算法流程就是采取不同的尺度进行SSR操作,再进行加权处理即可。

        二、算法流程

       MSR去雾算法流程步骤如下:

        1、读取图像

        2、设置高斯滤波器滤波尺度参数(高斯模糊)

        3、根据高斯滤波参数,对图像RGB图像分别进行SSR(单尺度retinxe)处理,根据不同尺度的SSR,进行加权处理,得到每个图层的MSR结果

        4、去雾滤波后的每个图层合成为去雾后的图像。

        下面看看matlab的实现效了。

        三、Matlab实现效果

        1、读取原图

        2、去雾后的图像

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

专注、专一于Matlab图像处理学习、交流、代做

QQ:3249726188

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
由于Retinex算法有多种实现方式,以下是一种基于多尺度MSRMulti-Scale Retinex)的Python代码示例: ```python import cv2 import numpy as np def multi_scale_retinex(img, sigma_list): # 定义高斯滤波器函数 def gaussian_filter(size, sigma): gaussian_kernel = np.zeros((size, size), np.float32) center = size // 2 for i in range(size): for j in range(size): x, y = i - center, j - center gaussian_kernel[i, j] = np.exp(-(x**2 + y**2) / (2 * sigma**2)) gaussian_kernel /= np.sum(gaussian_kernel) return gaussian_kernel # 将图像转换为灰度图像 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float32) / 255 # 定义多尺度MSR参数 alpha, beta, gamma = 125, 46, 15 # 对不同尺度的高斯滤波器进行MSR处理 img_msr = np.zeros(img_gray.shape, np.float32) for sigma in sigma_list: img_filtered = cv2.filter2D(img_gray, -1, gaussian_filter(15, sigma)) img_log = np.log10(img_gray + 1) - np.log10(img_filtered + 1) img_msr += alpha * img_log - beta * np.log10(sigma) - gamma # 对MSR结果进行归一化 img_msr = (img_msr - np.min(img_msr)) / (np.max(img_msr) - np.min(img_msr)) return img_msr if __name__ == '__main__': # 读取图像 img = cv2.imread('test.jpg') # 处理图像 sigma_list = [15, 80, 250] img_msr = multi_scale_retinex(img, sigma_list) # 显示结果 cv2.imshow('Original Image', img) cv2.imshow('Multi-Scale Retinex Image', img_msr) cv2.waitKey(0) ``` 该代码实现了一个简单的多尺度MSR算法,其中`sigma_list`是多尺度参数列表,每个参数对应一个高斯滤波器的标准差。通过对不同尺度的图像进行MSR处理,最终得到一个归一化的Retinex图像。需要注意的是,该代码中使用的是基于对数域的MSR算法,与一些其他实现方式可能存在一些差异。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值