始于Edwin Herbert Land(埃德温·赫伯特·兰德)于1971年提出的一种被称为色彩恒常的理论,并基于此理论的图像增强方法。Retinex这个词由视网膜(Retina)和大脑皮层(Cortex)合成而来.之所以这样设计,表明Land他也不清楚视觉系统的特性究竟取决于此两个生理结构中的哪一个,抑或两者都有关系。不同于传统的图像增强算法,如线性、非线性变换、图像锐化等只能增强图像的某一类特征,如压缩图像的动态范围,或增强图像的边缘等,Retinex可以在动态范围压缩、边缘增强和颜色恒常三方面达到平衡,可以对各种不同类型的图像进行自适应性地增强,在很多方面得到了广泛的应用。
Retinex 理论的基本内容是物体的颜色是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照非均性的影响,具有一致性,即Retinex理论是以色感一致性(颜色恒常性)为基础的。如下图所示,观察者所看到的物体的图像S是由物体表面对入射光L反射得到的,反射率R由物体本身决定,不受入射光L变化。
对于观察图像S,有公式表示为:
Retinex算法核心在于入射分量的获取,简单来说,这个可以对原图像进行高斯卷积获取。当图像比较大的时候,其计算过程是非常复杂的, O(MNPQ) , M , N 是原图像的高度和宽度, P , Q 是卷积核大小。实现的时候可以使用递归高斯滤波,复杂度 O(MN) (参见paper:Recursive implementation of the Gaussian filter,源码在GIMP中有)。下面我给出在3种不同尺度下获取的亮度图,等分权重。
GIMP中色彩恢复代码如下:
/* Final calculation with original value and cumulated filter values. The parameters gain, alpha and offset are constants. */
/* Ci(x,y)=log[a Ii(x,y)]-log[ Ei=1-s Ii(x,y)] */
alpha = 128.0f;
gain = 1.0f;
offset = 0.0f;
for ( i = 0; i < size; i += bytes )
{
float logl;
psrc = src+i;
pdst = dst+i;
logl = (float)log( (float)psrc[0] + (float)psrc[1] + (float)psrc[2] + 3.0f );
pdst[0] = gain * ((float)(log(alpha * (psrc[0]+1.0f)) - logl) * pdst[0]) + offset;
pdst[1] = gain * ((float)(log(alpha * (psrc[1]+1.0f)) - logl) * pdst[1]) + offset;
pdst[2] = gain * ((float)(log(alpha * (psrc[2]+1.0f)) - logl) * pdst[2]) + offset;
}
另外,最后一步代码又增加了调节项,用于控制饱和度和颜色,最后将其量化到[0~255],详细代码如下。
/*
Adapt the dynamics of the colors according to the statistics of the first and second order.
The use of the variance makes it possible to control the degree of saturation of the colors.
*/
pdst = dst;
compute_mean_var( pdst, &mean, &var, size, bytes );
mini = mean - rvals.cvar*var;
maxi = mean + rvals.cvar*var;
range = maxi - mini;
if ( !range ) range = 1.0;
for ( i = 0; i < size; i+= bytes )
{
psrc = src + i;
pdst = dst + i;
for (j = 0 ; j < 3 ; j++)
{
float c = 255 * ( pdst[j] - mini ) / range;
psrc[j] = (unsigned char)clip( c, 0, 255 );
}
}
free (dst);
我依据GIMP中插件contrast-retinex.c用Matlab实现了一遍,效果如下
Retinex算法在图像增强诸多领域应用广泛,如上述宽动态图像增强,水下图像增强,雾天图像增强,低照度图像增强等等,更多可以参考NASA关于Retinex的介绍。Retinex的实现,C语言用了递归高斯滤波器,我不知道Matlab是否有对应的函数,我在这里是将图像转换到频率域高斯低通滤波处理的,因此算法时间耗费也并不大。OpenCV版本的Retinex算法已传到CSDN上共享,下载请点击这里,记得给好评哦。
http://dragon.larc.nasa.gov/
http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html
A multiscale retinex for bridging the gap between color images and the human observation of scenes
作者 | 日期 | 联系方式 |
---|---|---|
风吹夏天 | 2015年5月13日 | [email protected] |