Retinex图像增强算法(SSR, MSR, MSRCR)详解及其OpenCV源码

Retinex图像增强算法(SSR, MSR, MSRCR)详解及其OpenCV源码Retinex 图像增强算法 SSR MSR MSRCR 详解及其 OpenCV 源码 Retinex 是一种常用的建立在科学实验和科学分析基础上的图像增强方法 它是 Edwin H Land 于 1963 年提出的 就跟 Matlab 是由 Matrix 和 Laboratory 合成的一样 Retinex 也是由两个单词合成的一个词语 他们分别是 retina 和 cortex 即 视网膜和皮层 Land 的 retinex 模式是

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算法。笔者在本文中,从原理阐述算法的流程,并提供源码地址。

一. 单尺度SSR(Single Scale Retinex)

1. 原理

其中,R(x, y)表示了物体的反射性质,即图像内在属性,我们应该最大程度的保留;而L(x, y)表示入射光图像,决定了图像像素能达到的动态范围,我们应该尽量去除。
一般,我们把照射图像假设估计为空间平滑图像,原始图像为S(x, y),反射图像为R(x, y),亮度图像为L(x, y),可以得出上面的公式(1),以及下面的公式:

r(x,y)=logR(x,y)=logS(x,y)L(x,y) …………(2)

r(x,y)=logS(x,y)log[F(x,y)S(x,y)] ………….(3)

这里,r(x, y)是输出图像,式(3)中后面中括号里的运算是卷积运算。F(x, y)是中心环绕函数,表示为:

F(x,y)=λe(x2+y2)c2 ………….(4)

式(4)中的C是高斯环绕尺度,λ是一个尺度,它的取值必须满足下式:

F(x,y)dxdy=1 ………….(5)

上面的式中可以看出,SSR算法中的卷积是对入射图像的计算,其物理意义是通过计算像素点与周围区域在加权平均的作用下,估计图像中照度的变化,并将 L(x,y) 去除,只保留 S(x,y) 属性。

2. 算法的实现流程

单尺度Retinex算法SSR的实现流程可以概括如下:

  1. 读原图S(x, y):
    • 若原图为灰度图:将图像各像素的灰度值由整数型(int)转换为浮点数(float),并转换到对数域;
    • 若原图为彩色图:将颜色分通道处理,每个分量像素值由整数型(int)转换为浮点数(float),并转换到对数域;


  2. 输入高斯环绕尺度C,把积分运算离散化,转为求和运算,通过上式(4)(5)确定λ的值;
  3. 由式(3)得r(x, y)
    • 若原图是灰度图,则只有一个r(x, y)
    • 若原图为彩色图,则每个通道都有一个对应的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. 原理

r(x,y)=Kkwk{
logS(x,y)log[Fk(x,y)S(x,y)]}
…………(6)

w1=w2=w3=13 …………(7)

此外,实验表明,ci分别取15, 80, 200可以得到较好效果。

2. 效果对比

原图
原图
SSR(尺度为300)增强
SSR(尺度为300)增强
MSR(最大尺度为300,尺度数为3)增强
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. 原理

RMSRCRi(x,y)=Ci(x,y)RMSRi(x,y) …………(8)
Ci(x,y)=f[Ii(x,y)]=f[Ii(x,y)Nj=1Ij(x,y)] …………(9)
f[Ii(x,y)]=βlog[αIi(x,y)]=β{
log[αIi(x,y)]log[Nj=1Ij(x,y)]
}
…………(10)
其中参数说明如下:






  • Ii(x, y)表示第i个通道的图像
  • Ci表示第i个通道的彩色回复因子,用来调节3个通道颜色的比例;
  • f(·)表示颜色空间的映射函数;
  • β是增益常数;
  • α是受控制的非线性强度;

但是MSRCR算法处理图像后,像素值一般会出现负值。所以从对数域r(x, y)转换为实数域R(x, y)后,需要通过改变增益Gain,偏差Offset对图像进行修正。使用公式可以表示为:
RMSRCRi(x,y)=GRMSRCRi(x,y)+O …………(11)
式(11)中,G表示增益Gain,O表示偏差Offset。它们的值取决于软件中的算法实现。




2. MSRCR其他实现方法

  • 计算出 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;




就是经过这么简单的处理,实践证明可以取得非常好的效果,下面贴出一些处理后的效果。

MSR(尺度为300,尺度数为3)增强
MSR(尺度为300,尺度数为3)增强
MSRCR(尺度为300,尺度数3,Dynamic = 2)增强
MSRCR(尺度为300,尺度数3,Dynamic = 2)增强
MSRCR(尺度为300,尺度数6,Dynamic = 2)增强
MSRCR(尺度为300,尺度数6,Dynamic = 2)增强










MSR(尺度300,尺度数为3)增强
MSR(尺度300,尺度数为3)增强
MSRCR(尺度300,尺度为3,Dynamic = 2)增强图像
MSRCR(尺度300, 尺度为3, Dynamic = 2)增强图像
MSRCR(尺度300,尺度为6,Dynamic = 2)增强图像
MSRCR(尺度300, 尺度为6, Dynamic = 2)增强图像










由以上三幅图的效果得出的结论:

  • MSRCR效果要比MSR好很多,基本消除了色偏。
  • 对于MSRCR,尺度数对结果的影像不是特别大,但是随着尺度数的增加,算法耗时会线性增加,因此,一般尺度数取3就较为合适了。

MSRCR(Dynamic = 1)增强图像
MSRCR(Dynamic = 1)增强图像
MSRCR(Dynamic = 2)增强图像
MSRCR(Dynamic = 2)增强图像
MSRCR(Dynamic = 5)增强图像
MSRCR(Dynamic = 5)增强图像










由以上三幅图的效果得出的结论:

  • Dynamic取值越小,图像的对比度越强。
  • 一般来说Dynamic取值2-3之间能取得较为明显的增强效果,即能取得很自然过渡效果,又能保持图像的清晰度适度增强。

关于尺度,个人建议取值以大于100为佳。

retinex算法的效果对于一些正常的图像处理后的效果并不佳,我们可以认为它就是为那些在外界环境不理想的状态下拍摄的图像增强而设计的,如对于航拍的雾天图片,医学上的成像图片等成像条件恶劣的图有很明显的效果。笔者的毕业设计涉及了水下图像的修复,水下图像相对于空气中成像性低,应该会有很大的效果。

NASA在处理航天相关照片时也使用了Retinex技术。关于NASA对Retinex技术的应用,可以参考:http://dragon.larc.nasa.gov/retinex/

四. Retinex图像增强算法的其他算法

RMSRCRi(x,y)=255RMSRCRi(x,y)mini(min(x,y)RMSRCRi(x,y))maxi(max(x,y)RMSRCRi(x,y)mini(min(x,y)RMSRCR(x,y)))



…………(12)

由于Retinex数据处理后的高动态特性,所以这种方式处理后,数据分布很广,会出现严重两极化现象,一般情况难以得到满意的结果。

五. OpenCV源码

cmake ./ make


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

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

(0)
上一篇 2026年3月18日 下午2:04
下一篇 2026年3月18日 下午2:04


相关推荐

发表回复

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

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