我看了n多关于基於单尺度Retinex图像增强的文献,用的高斯滤波函数都不一样,有的直接用高斯滤波器,就是自带的gaussian函数实现,有的是用自定义高斯函数,然而公式系数又都不一样,我快被搞疯了,研究了三天,终于在Matlab上实现了这个 “简单” 的SSR,想哭???
-
Retinex的理论依据
世界本是无色的,人们看到的颜色是 光和物质相互作用 的结果。
Retinex理论正印证了这一观点,认为物体的颜色与物体表面光照强度的绝对值,或者说反射光的绝对值关系不大,
而是由其接收到的不同波长的光线的反射能力所决定的,这是Retinex理论的核心所在。
Land提出的Retinex算法是一种建立在科学实验和分析上的常用的空域图像增强手段,如同Matlab是由Matrix(矩阵)和Laboratory(实验室)两个单词组合而成一样,Retinex是由Retina(视网膜)和Cortex(大脑皮层)两者组合而成,又可以被称为视网膜大脑皮层理论。
它建立在三个假设的基础上:
- 人眼能感知的颜色实际上是光和物质相互作用的产物,而原本真实的世界是无色的。就如水本应是无色的,但我们看见水膜或肥皂膜呈现出五彩缤纷的色彩,实际上是薄膜干涉产生的。
- 固定波长的三原色(红、绿、蓝)构成了每一个颜色区域。
- 三原色决定了物体每个单位像素点的颜色。
Retinex算法的基础理论: 人类视觉系统观察到的物体的颜色是由物体对三种波形的反射能力决定的,分别是长波(红色)、中波(绿色)、短波(蓝色)。物体的色彩不受光照强度和光照的非均匀性所影响,具有一致性。
Retinex可以在色彩恒常性、动态范围压缩和边缘增强三个方面达到平衡。
- 色彩恒常性
所谓色彩恒常性就是人体会通过视觉系统HVS(Human cisual system)对观察到的物体色彩变化进行处理,只保留物体内在的信息,而不会随外界光照的变化而对物体产生不同的认知变化,大脑皮层接收到这些物体的本质信息后,经过处理形成人的视觉。
例如,用红色光照射白色物体的表面,我们看到的不是红色,而是在红光照射下的白色。这就是一中色彩恒常性的表现。
由于光照环境的变化,使某一物体表面反射谱不同,人类视觉系统能够判断识别出该变化是否由光照环境变化产生,当光照的变化在一定范围内时,在这一变化范围内的人的视觉识别机制认为物体表面颜色是恒定不变的。颜色恒常性是指人对物体颜色的知觉,与人的知识经验、心理倾向有关,不是指物体本身颜色的恒定不变。
- 经典的Retinex图像增强算法
在Retinex模型中,图像I(x,y)被分为两部分,一部分是反射分量R(x,y),代表物体的本质信息,另一部分是入射分量L(x,y),表示的是入射光亮,即亮度图像,模型如下:
Retinex理论认为,图像可以由反射图像和亮度图像的乘积构成:
Retinex的核心就是要获得表现本质信息的反射图像。通过分离入射图像,就有可能减弱因光照因素产生的对图像的影响,可以增强图像的细节信息,获得代表图像本质信息的内容。
通常Retinex算法是把上述乘法式转换到对数域,即把乘法转换至加法:log I = log (R x L) = log R + log L。
我们需要对多种Retinex算法中具有代表性的三种算法进行分析与掌握:
- 单尺度Retinex算法(Single-Scale Retinex,SSR)
- 多尺度Retinex算法(Multi-Scale Retinex,MSR)
- 带色彩恢复的多尺度Retinex算法(The Color Restoration Step of Multiscale Retinex,MSMCR)
-
单尺度Retinex算法
求入射图像在数学上是一个奇异问题,而在单尺度Retinex算法中,Jobson等人发现用高斯函数与图像进行卷积能够近似的表现入射分量:
SSR的实现过程:
因为 I=RxL 所以 R=I/L , 即 log R = log I - log L。
·········>
本质是一个低通滤波器,K是归一化常数,使成立。
c表示高斯核,决定了G的邻域大小,可以控制图像细节和色彩的保留情况。
c较小时,原图像局部细节较为突出,但会出现颜色失真;
c较大时,G的邻域范围就大,颜色较自然,但以某一像素点为中心的周围其他像素对这个像素点的影响就越小,这样就会导致对图像的细节信息保留较少,图像的对比度信息不强。相关实验表明,c的取值一般在80-100的范围内。
SSR算法的具体实现步骤:
1.读取原始待增强图像 I(x,y),并进行数据类型变换,将整型变换为double型;
2.确定参数c的大小,并根据公式确定系数K的取值;
3.根据公式来获得图像R(x,y);
4.对R(x,y)进行线性校正处理(因为R(x,y)的范围不在0-255内),校正后的图像即为算法增强图像。
注意:对灰度图像进行处理时,按上述步骤即可,但彩色图像进行增强时,需要把彩色图像分为R、G、B三个分量分别按以上步骤进行处理,然后再合成获得增强图像。
Matlab代码实现:
I=imread('test.jpg');
Ir=I(:,:,1);%提取红色分量
Ig=I(:,:,2);%提取绿色分量
Ib=I(:,:,3);%提取蓝色分量
I1=SSR(Ir); %自定义单尺度Retinex处理函数
I2=SSR(Ig);
I3=SSR(Ib);
In=cat(3,I1,I2,I3); %cat用于构造多维数组
subplot(1,2,1);imshow(I);
title('A). 原始图像');
subplot(1,2,2);imshow(In,[]);
title('B). 单尺度Retinex');
%——————————————划重点!!!!!!!!!!!!!!!!!!!!————————————————
function A = SSR(I)
G=I;
[m,n]=size(I);
I=double(I);
x0=floor((m+1)/2);y0=floor((n+1)/2);
c = 80;
K=1/(sqrt(2*pi)*c);
for x=1:m
for y=1:n
G(x,y)=K*(exp(-((x-x0)^2+(y-y0)^2)/(2*c^2))); %高斯函数
end
end
Gfft=fft2(G);
Ifft=fft2(I);
Lfft=Gfft.*Ifft;
L=ifft2(Lfft);
r=log(I+1)-log(L+1); %加1是为了防止对数为0时,log0没有定义
%线性拉伸,将灰度范围转换到0-255,(直接求反对数的效果不好)
MIN=min(min(r));
MAX=max(max(r));
new=(r-MIN)*255/(MAX-MIN);
A=new;
end
看一下处理效果: