其实关于Retinex理论的研究很多很多,这里只是简单概述一下,本文更多的是在遥感影像上的处理效果讨论。
根据Retinex理论,人眼感知物体的亮度取决于环境的照明和物体表面对照射光的反射,其数学表达式为:
I(x,y) = L(x,y) * R(x,y)
其中 I(x,y)代表被观察或照相机接收到的图像信号;L(x,y)代表环境光的照射分量 ;R(x,y)表示携带图像细节信息的目标物体的反射分量 。
将上式两边取对数,则可抛开入射光的性质得到物体的本来面貌,即有关系式 :
Log[R(x,y)] = Log[I(x,y)] - Log[L(x,y)]
也就是,对于一副图像数据I(x, y),要计算出对应的反射分量R(x, y),也可以认为R(x, y)就是增强后的图像。现在的关键是如何得到L(x, y)。L(x, y)是光照分量,可以通过对图像数据I(x, y)进行高斯模糊获得。
具体步骤如下:
1. 输入原始图像数据I(x, y)和尺度(模糊的半径)
2. 计算原始图像按指定尺度进行模糊后的图像 L(x, y)
3. 按照公式的计算方法计算出 Log[R(x, y)]的值
4. 将 Log[R(x, y)]量化到0到255范围的像素值输出
Retinex算法很关键的一点在于光照分量L(x, y)的计算,目前已经有很多方法,如一维处理(随机路径等),二维处理(中心环绕,变分框架等),通过不同方法得到的L(x, y)不同,最终得到的R(x, y)也不同。这里我并没有做相关对比实验,我使用的是最经典的高斯模糊方法计算L(x, y)。但是高斯模糊这里面也有一个可调参数,即模糊尺度,不同的模糊尺度,计算的结果也不同,如下图所示。分别是原图、尺度为50、100、200。
本文最想说的一点是,Log[R(x,y)]的值怎样量化的问题,不同的量化方法得到最终图像肯定不同,一种最简单的方式就是直接统计出Log[R(x,y)]的最大值Max和最小值Min,然后对每一个值Value,进行线性量化。
R(x,y) = ( Value - Min ) / (Max - Min) * (255-0)
还有一种是利用均值与标准差计算出最大值Max和最小值Min,然后进行线性量化。
Max = Mean + k * SD
Min = Mean - k * SD
或者不进行对数化,直接用I(x,y) -L(x,y)表示R(x,y)。
当然还有很多其他的量化方法~~废话不多说了,看图。分别是原图,无对数化最值,对数化最值,对数化均值与标准差,无对数化均值与标准差。