基于retinex理论改进的低照度图像增强算法

基于retinex理论改进的低照度图像增强算法写本文的目的是记录自己学习过或做过的一些东西 深化理解 理清思路 便于回忆 本人处于学习阶段 欢迎指出不对的地方 本文算法参考文献 李勇 基于 Retinex 理论的低照度图像增强算法研究与实现 D 西安电子科技大学 2018 本文是本人按照作者发表的原文进行复现并稍加改动 在尽力的基础上由于本人水平有限 对作者一些想法的理解和结果的复现不一定正确 需要研究此算法的朋友 在看我文章的时候最好加入自己的判断 或者直接查看原文 欢迎各位指出我不对的地方 或者与我探讨交流 需要程序可评论 原文摘要图像作为信

写本文的目的是记录自己学习过或做过的一些东西,深化理解,理清思路,便于回忆。本人处于学习阶段,欢迎指出不对的地方。

本文算法参考文献:李勇.基于Retinex理论的低照度图像增强算法研究与实现[D].西安电子科技大学,2018

本文是本人按照作者发表的原文进行复现并稍加改动,在尽力的基础上由于本人水平有限,对作者一些想法的理解和结果的复现不一定正确,需要研究此算法的朋友,在看我文章的时候最好加入自己的判断,或者直接查看原文。欢迎各位指出我不对的地方,或者与我探讨交流!需要程序可评论。

原文摘要

图像作为信息的一种载体,在通信领域与计算机领域得到了广泛的应用。海量的图像当中,因为拍摄环境因素造成的低照度图像占了很大比例。低照度图像一般包含较明显的噪声,亮度比较低,细节不明显,颜色失真严重,上述缺点降低了低照度图像的应用价值。低照度图像增强处理是图像增强领域比较重要的分支,传统的增强算法只能改善低照度图像的部分缺点,增强效果不理想。Retinex算法基于人眼视觉系统感知物体亮度和颜色模型,具有色彩恒常性,并且可以做到亮度提升、细节增强和颜色保真的统一,对低照度图像质量的提升比较全面。

本文针对整体亮度比较低的图像提出了自适应权值的多尺度Retinex算法。低照度图像包含较多的零像素点,为此引入了幅度补偿机制,解决了Retinex算法中对数变换导致图像数据截断的问题;将图像进行分块,在每一个子块内部,根据图像的平坦特性计算子块的最佳尺度参数,利用最佳尺度参数和经典尺度参数间的关系进行自适应权值计算,解决了多尺度Retinex算法使用全局滤波器效果不佳的问题;本文利用颜色通道之间的关系定义了图像的归一化亮度,然后利用归一化亮度对低照度原图和增强结果进行线性匹配,避免了图像正常亮度区域的过度增强问题。实验结果表明,自适应权值的多尺度Retinex算法在图像细节增强、亮度保持以及色彩保真方面效果较好。

针对部分区域较亮的低照度图像,本文提出了基于PLIP(Parameterized Logarithmic Image Processing)模型的Retinex低照度图像增强算法。该算法将PLIP模型的运算规则和图像卷积操作结合起来,形成了PLIP模型下的高斯滤波器,并在HSV空间下对图像亮度分量进行增强处理,有效的降低了反射分量计算过程中的超值区间问题;利用图像的背景亮度和人眼视觉的关系对增强后的亮度分量进行非线性调整,改善了图像的视觉效果;按照饱和度和亮度之间的相关关系对饱和度进行修正,改善了图像的视觉效果。实验结果表明,基于PLIP模型的Retinex增强算法在增强低照度区域的同时对高亮区域进行了饱和度修正,使高亮区域的增强结果更加符合人眼视觉效果,避免出现过度增强现象。

低照度图像的相关背景这里就不再赘述了,百度百科和一些论文里介绍的很清楚。

在这里插入图片描述
在这里插入图片描述
上述两个公式是retinex理论中最基本也是最核心的公式,之前的文章里也提到过。对于低照度图像来说,入射分量是干扰因素,我们需要求得的是反射分量,入射分量可由原始图像卷积高斯函数来近似估计,接下来就谈谈我个人对这两个公式的理解。

在上述公式中,入射分量是低频分量,反射分量是高频分量。初学者们可能对这一点不是很明白,白天的时候我们看东西很清晰,其实是因为我们能清楚的辨别每个物体的边缘,这些边缘对于一幅图像来说就是高频分量,因为这些边缘在数字图像中,其实就是像素值发生突变的点,你可以将整幅图像想象成一个二维函数,边缘就是函数值变化剧烈的地方,也就是导数大的地方。这些地方在经过傅里叶变换的时候就属于高频部分(因为一个较为陡峭的函数,需要更多的高频分量去表示,这里涉及到信号与系统的基础知识)。剩下的非边缘部分自然就是低频部分,也就是我们所说的像素值变化平坦的区域,也就是在图像这个二维函数中,导数较小或者为零的区域。

对于低照度图像而言,我们希望能在夜色中清楚地看清图像原本存在的边缘信息,然而夜色却将这些这些信息隐藏,只给我们留下一大片黑色,这样做不就是将原本参差不齐的一个二维函数,便平坦了吗。这里的夜色我们可以将它视为入射分量,图像原本包括的边缘信息,我们可以视之为反射分量。这样来想的话,就很好理解为什么入射分量是低频信息,而反射分量是高频分量。

接下来解释上述第一个函数,既然入射分量代表低频,反射分量代表高频,我们再回头去看这个函数,一个低频信号乘以一个高频信号,可以让人很容易联想到通信原理中的调制(这里指幅度调制)。载波是高频的,我们要发送的原始信号是低频的,二者相乘之后,载波信号的幅度会随着原始信号的波动特征而产生幅度的变化。而在低照度图像中,入射分量其实就起到改变原始图像高频信息幅度的作用,入射分量将原本波动很大的图像高频部分的差异缩小了,这样就相当于遮住了图像的特征,我们看到的就不是原始图像的边缘细节,而是一大片黑色(同质区)。

接下来解释上述第二个函数,其实从频域是最好理解的,既然入射分量是低频信息,那高斯函数就相当于一个低通滤波器。图像经过傅里叶变换(fftshift之后)低频部分集中在图像中心部分,而高斯函数的傅里叶变换就是它本身,时域卷积等于频域相乘,就是将图像的低频部分通过。另外还需一提,高斯函数的sigma控制着高斯函数的胖瘦,因为图像经过fft和fftshift之后,中心是最低频率,越向外围频率越高,所以高斯函数的sigma值越大则过滤后得到的高频成分越多。同样,这个公式也可以从时域理解,这里就不再解释了。

以上求得入射分量之后,便可求得反射分量,具体算法网上一搜一堆,具体过程就不再介绍。这个算法的缺陷也特别明显,就是高斯函数的sigma值是固定的。不同的sigma值其实有不同的功能,上面说过sigma越大则结果包含的高频成分越多,所以其实sigma值的选取会影响图像最终的效果是偏向增强还是偏向细节保留。

SSR算法对尺度参数的依赖比较大,较大的尺度参数可以使图像色彩保留较好,还可以抑制噪声,但是对细节的损坏比较严重,对比度增强效果较差;较小的尺度参数可以增强图像的细节,但是容易出现颜色失真和光晕现象。(原文)

举例一种情况,当sigma取值较小时,我们求得的入射分量就会包含更少的高频信息,也就是说求得的入射分量会更注重于低照度增强而不是边缘保持。之后我们为了求得反射分量,会将现在求得的入射分量从原始图像中减去,所以最终求得的反射分量会更注重于边缘细节保持而不偏向于低照度增强。当sigma取值较大时,情况与此相对应。

做一下总结:在传统ssr算法中,当sigma取值较小时,得到的最终效果图边缘保持效果更佳;当sigma取值较大时,得到的最终效果图低照度增强效果更佳。

原文作者又提出了一种改进办法,就是从三分之一权重处入手。如果我们能判断一个点到底是处于图像的边缘区域(携带高频信息),还是同质区(携带低频信息),我们就可以来更改这个权重。如果这个像素点处于边缘区域(携带高频信息),那么我们可以让sigma取值较小那个效果图的权重更大一些。如果这个像素点处于同质区(携带低频信息),那么我们可以让sigma取值较大那个效果图的权重更大一些。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233743.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Js保留两位小数_前端小数点保留两位方法

    Js保留两位小数_前端小数点保留两位方法js保留两位小数的方法js保留两位小数的方法如下1、toFixed()方法需注意,保留两位小数,将数值类型的数据改变成了字符串类型2、Math.floor(),不四舍五入,向下取整注意,不改变数据类型3、字符串匹配注意,先将数据转换为字符串,最后再转为数值类型4、四舍五入保留2位小数(若第二位小数为0,则保留一位小数)注意,数据类型不变5、四舍五入保留2位小数(不够位数,则用0替补)注意,数据类…

    2022年8月10日
    8
  • 国产FPGA现状_fpga未来发展前景

    国产FPGA现状_fpga未来发展前景原文:https://www.sohu.com/a/229245757_132567来源:内容来自财通证券TMT组,谢谢。2018年上半年对于中国半导体行业而言是多事之秋,发生了几件让国人深入思考的大事。我作为IC产业的逃兵,最近也在思考很多的问题,包括资本市场、集成电路行业和研究所的一些不成熟的想法。2008年进入华中科技大学电子系,中科院半导体所毕业后进入联发科从事手机芯片开发(没错,就是卖的不怎么好的X30)。离开MTK之前有一段小插曲,招我进联发科的老大后来自己出来创业做安防芯片,当时喊

    2022年4月19日
    46
  • MYsql 锁表解决办法

    MYsql 锁表解决办法MySQL锁表解决方法一、我的处理过程1、查进程,主要是查找被锁表的那个进程的IDSHOWPROCESSLIST;2、kill掉锁表的进程IDKILL 10866;//后面的数字即时进程的ID网上找了些资料,了解了一下,先分享一下:二、mysql的锁表问题SHOWPROCESSLIST查看数据库中表的状态,是否被锁;killid //杀掉被锁的表===================…

    2022年5月7日
    42
  • Spring各jar包的作用

    Spring各jar包的作用Spring各jar包的作用

    2022年4月22日
    48
  • Python生成随机数列表_numpy产生指定范围的随机数

    Python生成随机数列表_numpy产生指定范围的随机数一.最直接的方式:用numpy.random模块来生成随机数组1、np.random.rand用于生成[0.0,1.0)之间的随机浮点数,当没有参数时,返回一个随机浮点数,当有一个参数时,返回该参数长度大小的一维随机浮点数数组,参数建议是整数型,因为未来版本的numpy可能不支持非整形参数。importnumpyasnp>>>np.random.rand(10)array([0

    2022年10月4日
    2
  • pythoncharm注释快捷键_多行注释以什么开头

    pythoncharm注释快捷键_多行注释以什么开头PyCharm多行注释快捷键为Ctrl+/。

    2022年8月29日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号