Retinex图像增强算法(SSR,MSR,MSRCR)详解及其OpenCV源码Retinex图像增强算法(SSR, MSR, MSRCR)详解及其OpenCV源码
Retinex是⼀种常⽤的建⽴在科学实验和科学分析基础上的图像增强⽅法,它是Edwin.H.Land于1963年提出的。就跟Matlab是由Matrix 和Laboratory合成的⼀样,Retinex也是由两个单词合成的⼀个词语,他们分别是retina 和cortex,即:视⽹膜和⽪层。Land的retinex模式是建⽴在以下三个假设之上的:
真实世界是⽆颜⾊的,我们所感知的颜⾊是光与物质的相互作⽤的结果。我们见到的⽔是⽆⾊的,但是⽔膜—肥皂膜却是显现五彩缤纷,那是薄膜表⾯光⼲涉的结果。
每⼀颜⾊区域由给定波长的红、绿、蓝三原⾊构成的;
三原⾊决定了每个单位区域的颜⾊。
Retinex理论的基础理论是物体的颜⾊是由物体对长波(红⾊)、中波(绿⾊)、短波(蓝⾊)光线的反射能⼒来决定的,⽽不是由反射光强度的绝对值来决定的,物体的⾊彩不受光照⾮均匀性的影响,具有⼀致性,即retinex是以⾊感⼀致性(颜⾊恒常性)为基础的。不同于传统的线性、⾮线性的只能增强图像某⼀类特征的⽅法,Retinex可以在动态范围压缩、边缘增强和颜⾊恒常三个⽅⾯达到平衡,因此可以对各种不同类型的图像进⾏⾃适应的增强。
40多年来,研究⼈员模仿⼈类视觉系统发展了Retinex算法,从单尺度Retinex算法,改进成多尺度加权平均的MSR算法,再发展成彩⾊恢复多尺度MSRCR算法。笔者在本⽂中,从原理阐述算法的流程,并提供源码地址。
参考链接:
参考论⽂:
《⼀种结合直⽅图均衡化和MSRCR的图像增强新算法》——李锦 等⼈
⼀. 单尺度SSR(Single Scale Retinex)
1. 原理
⼀幅给定的图像S(x,y)可以分解为两个不同的图像:反射图像R(x,y)和⼊射图像(也有⼈称之为亮度图像)L(x,y),其原理图如下所⽰:
如上图所⽰,图像可以看做是⼊射图像和反射图像构成,⼊射光照射在反射物体上,通过反射物体的反射,形成反射光进⼊⼈眼。最后形成的图像可以如下公式表⽰:
其中,R(x, y)表⽰了物体的反射性质,即图像内在属性,我们应该最⼤程度的保留;⽽L(x, y)表⽰⼊射光图像,决定了图像像素能达到的动态范围,我们应该尽量去除。
⼀般,我们把照射图像假设估计为空间平滑图像,原始图像为S(x, y),反射图像为R(x, y),亮度图像为L(x, y),可以得出上⾯的公式(1),以及下⾯的公式:
(2)
(3)
这⾥,r(x, y)是输出图像,式(3)中后⾯中括号⾥的运算是卷积运算。F(x, y)是中⼼环绕函数,表⽰为:
(4)
式(4)中的C是⾼斯环绕尺度,λ是⼀个尺度,它的取值必须满⾜下式:
(5)
上⾯的式中可以看出,SSR算法中的卷积是对⼊射图像的计算,其物理意义是通过计算像素点与周围区域在加权平均的作⽤下,估计图像中照度的变化,并将去除,只保留属性。
2. 算法的实现流程
单尺度Retinex算法SSR的实现流程可以概括如下:
1. 读原图S(x, y):
1. 若原图为灰度图:将图像各像素的灰度值由整数型(int)转换为浮点数(float),并转换到对数域;
2. 若原图为彩⾊图:将颜⾊分通道处理,每个分量像素值由整数型(int)转换为浮点数(float),并转换到对数域;
2. 输⼊⾼斯环绕尺度C,把积分运算离散化,转为求和运算,通过上式(4)(5)确定λ的值;
3. 由式(3)得r(x, y);
1. 若原图是灰度图,则只有⼀个r(x, y);
2. 若原图为彩⾊图,则每个通道都有⼀个对应的r(x, y);
图片下载站源码
4. 将r(x, y)从对数域转换到实数域,得到输出图像R(x, y);
5. 此时的R(x, y)值的范围并不是0–255,所以还需要进⾏线性拉伸并转换成相应的格式输出显⽰。
前⾯的公式中,中⼼环绕函数F(x, y)⽤的是低通函数,这样能够在算法中估计出⼊射图像对应原始图像的低频部分。从原始图像中除去低频照射部分,就会留下原始图像所对应的⾼频分量。⾼频分量很有价值,因为在⼈类的视觉系统中,⼈眼对边缘部分的⾼频信息相当敏感,所以SSR算法可以较好的增强图像中的边缘信息。
由于SSR算法中所选⽤的⾼斯函数特点,对于动态范围⼤幅度压缩和对⽐度增强两个指标,增强后的图像不能同时保证。但是为了平衡两种增强效果,就必须选择⼀个较为恰当的⾼斯尺度常量C。C值⼀般取值在80–100之间。
3. OpenCV源码
见源码附录的Retenix()函数。
⼆. 多尺度MSR(Multi-Scale Retinex)
1. 原理
MSR是在SSR基础上发展来的,优点是可以同时保持图像⾼保真度与对图像的动态范围进⾏压缩的同时,MSR也可实现⾊彩增强、颜⾊恒常性、局部动态范围压缩、全局动态范围压缩,也可以⽤于X光图像增强。
MSR计算公式如下:
(6)
式中,K是⾼斯中⼼环绕函数的个数。当K=1时,MSR退化为SSR。
通常来讲,为了保证兼有SSR⾼、中、低三个尺度的优点来考虑,K取值通常为3,且有:
(7)
此外,实验表明,ci分别取15, 80, 200可以得到较好效果。
⼀般的Retinex算法对光照图像估计时,都会假设初始光照图像是缓慢变化的,即光照图像是平滑的。但实际并⾮如此,亮度相差很⼤区域的边缘处,图像光照变化并不平滑。所以在这种情况下,Retinuex增强算法在亮度差异⼤区域的增强图像会产⽣光晕。
另外MSR常见的缺点还有边缘锐化不⾜,阴影边界突兀,部分颜⾊发⽣扭曲,纹理不清晰,⾼光区域细节没有得到明显改善,对⾼光区域敏感度⼩等。
2. 效果对⽐
对于SSR与MSR的效果如下所⽰:
原图
SSR(尺度为300)增强
MSR(尺度为300,尺度数为3)增强
原图
SSR(尺度为300)增强
MSR(最⼤尺度为300,尺度数为3)增强
3. OpenCV源码
见源码附录的MultiScaleRetinex()函数。
三. 带颜⾊恢复的MSR⽅法MSRCR(Multi-Scale Retinex with Color Restoration)
在以上的两幅测试图像中,特别是第⼆幅,我们看到明显的偏⾊效果,这就是SSR和MSR普遍都存在的问题。
为此,研究者⼜开发出⼀种称之为带⾊彩恢复的多尺度视⽹膜增强算法(MSRCR,Multi-Scale Retinex with Color Restoration) ,具体讨论的过程详见《A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes》论⽂。
1. 原理
在前⾯的增强过程中,图像可能会因为增加了噪声,⽽使得图像的局部细节⾊彩失真,不能显现出物体的真正颜⾊,整体视觉效果变差。针对这⼀点不⾜,MSRCR在MSR的基础上,加⼊了⾊彩恢复因⼦C来调节由于图像局部区域对⽐度增强⽽导致颜⾊失真的缺陷。
改进算法如下所⽰:
…………(8)
…………(9)
(10)
其中参数说明如下:
Ii(x, y)表⽰第i个通道的图像
Ci表⽰第i个通道的彩⾊回复因⼦,⽤来调节3个通道颜⾊的⽐例;
f(·)表⽰颜⾊空间的映射函数;
β是增益常数;
α是受控制的⾮线性强度;
MSRCR算法利⽤彩⾊恢复因⼦C,调节原始图像中3个颜⾊通道之间的⽐例关系,从⽽把相对较暗区域的信息凸显出来,达到了消除图像⾊彩失真的缺陷。
处理后的图像局部对⽐度提⾼,亮度与真实场景相似,在⼈们视觉感知下,图像显得更加逼真。
但是MSRCR算法处理图像后,像素值⼀般会出现负值。所以从对数域r(x, y)转换为实数域R(x, y)后,需要通过改变增益Gain,偏差Offset 对图像进⾏修正。使⽤公式可以表⽰为:
(11)
式(11)中,G表⽰增益Gain,O表⽰偏差Offset。它们的值取决于软件中的算法实现。
2. MSRCR其他实现⽅法
MSRCR⽅法如上,且获得了不错的效果。但在博⽂中,作者认为论⽂⾥的⽅法不起任何作⽤,并且论⽂⾥为了这个⼜引⼊了太多的可调参数,增加了算法的复杂性,不利于⾃动化实现。
博⽂作者认为,GIMP的contrast-retinex.c⽂件⾥使⽤的算法很好,效果也很好。他直接从量化的⽅式上⼊⼿,引⼊了均值和均⽅差的概念,再加上⼀个控制图像动态的参数来实现⽆⾊偏的调节过程,简要描述如下:
计算出 log[R(x,y)]中R/G/B各通道数据的均值Mean和均⽅差Var(注意是均⽅差)。
类似下述公式计算各通道的Min和Max值。
Min = Mean - Dynamic * Var;
Max = Mean + Dynamic * Var;
对Log[R(x,y)]的每⼀个值Value,进⾏线性映射:
R(x,y) = ( Value - Min ) / (Max - Min) * (255 - 0), 同时要注意增加⼀个溢出判断,即:
if (R(x, y) > 255) R(x,y) = 255;
else if (R(x,y) < 0) R(x,y) = 0;
就是经过这么简单的处理,实践证明可以取得⾮常好的效果,下⾯贴出⼀些处理后的效果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。