SSR(Single Scale Retinex,单尺度视网膜增强);
I(x,y)=L(x,y)*R(x,y) I 图像矩阵 L背景光分量 R目标反射分量
Log[R(x,y)] = Log[I(x,y)]-Log[L(x,y)];
取对数的原因在于扩展低灰度 压缩高灰度值 让图像的灰度分布更符合人的视觉特征
因此这个算法的细路就很简单了,具体步骤如下:
1、输入: 原始图像数据I(x,y),尺度(也就是所谓的模糊的半径) 高斯模糊
2、处理:(1) 计算原始图像按指定尺度进行模糊后的图像 L(x,y);
(2) 计算出 Log[R(x,y)]的值。
(3) 将 Log[R(x,y)]量化为0到255范围的像素值,作为最终的输出。
可以看得出,算法很简单,其核心的东西还是在于高斯模糊的实现。关于高斯模糊,网上有很多快速优化的文章参考,具体的参考代码可能很少有好人提供的。
注意到一点,似乎在量化的时候没有谁会将 Log[R(x,y)]进行Exp函数的运算而直接得到R(x,y),至于为什么,我无法给出明确的答案。
量化的方式其实有很多种,而这个方法在很大的程度上对处理的效果有着决定性的影响。至今我没看到有哪一篇论文对这一块讲的很清楚,也不知道他们的那些结果是如何取得的,一种最简单的方式就是计算出Log[R(x,y)]的最大值Max和最小值Min,然后对每一个值Value,进行线性量化,公式为:
R(x,y) = ( Value - Min ) / (Max - Min) * (255-0) (2-3)
论文中说,尺度取值较小时, 能够较好地完成动态范围的压缩,暗区域的细节能得到较好地增强,但输出颜色易失真;取值较大时,色感一致性较好。 我倒是没看出尺度小有什么好处。
以上算法所实现的过程通常倍称作为SSR(Single Scale Retinex,单尺度视网膜增强);
多尺度视网膜增强算法(MSR, Multi-Scale Retinex),最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。
了得到更好的效果,人们又开发出所谓的多尺度视网膜增强算法(MSR, Multi-Scale Retinex),最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。同单尺度相比,该算法有在计算Log[R(x,y)]的值时步骤有所不同:
(1) 需要对原始图像进行每个尺度的高斯模糊,得到模糊后的图像Li(x,y),其中小标i表示尺度数。
(2) 对每个尺度下进行累加计算 Log[R(x,y)] = Log[R(x,y)] + Weight(i)* ( Log[Ii(x,y)]-Log[Li(x,y)]); 其中Weight(i)表示每个尺度对应的权重,要求各尺度权重之和必须为1,经典的取值为等权重。
Log[R(x,y)] = 0 初始值
SSR和MSR在最大尺度相同的时候谁好谁坏我还真讲不清。
多尺度视网膜增强算法(MSRCR,Multi-Scale Retinex with Color Restoration)
从我目前的了解来看,GIMP的contrast-retinex.c文件里使用的算法很好,效果也很好。他直接从量化的方式上入手,引入了均值和均方差的概念,再加上一个控制图像动态的参数来实现无色偏的调节过程,简要描述如下。
(1)分别计算出 Log[R(x,y)]中R/G/B各通道数据的均值Mean和均方差Var(注意是均方差)。
(2)利用类似下述公式计算各通道的Min和Max值。
Min = Mean - Dynamic * Var;
Max = Mean + Dynamic * Var;
(3) 对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;
由以上三幅图的效果得出的结论:
(3)Dynamic取值越小,图像的对比度越强。
(4)一般来说Dynamic取值2-3之间能取得较为明显的增强效果,即能取得很自然过渡效果,又能保持图像的清晰度适度增强。
关于最大尺度,个人建议取值以大于100为佳。
retinex算法的效果对于一些正常的图像处理后的效果并不佳,我们可以认为他就是为那些在外界环境不理想的状态下拍摄的图像增强而设计的,特别的,对于航拍的雾天图片,医学上的成像图片等成像条件恶劣的图有很明显的效果,再列出一些照片处理效果
Retinex在图像去雾、宇航图、医学图像、老照片等图像的处理上效果很是明显。