Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法,最早由埃德温•兰德(Edwin. H. Land)于1963年提出。就跟Matlab是由Matrix和Laboratory合成的一样,Retinex也是由两个单词合成的一个词语,他们分别是retina 和cortex,即:视网膜和皮层。Land的retinex模式是建立在以下三个假设之上的:
(1)真实世界是无颜色的,我们所感知的颜色是光与物质的相互作用的结果。我们见到的水是无色的,但是水膜—肥皂膜却是显现五彩缤纷,那是薄膜表面光干涉的结果。
(2)每一颜色区域由给定波长的红、绿、蓝三原色构成的;
(3)三原色决定了每个单位区域的颜色。
Retinex理论的基础理论是物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定的,物体的色彩不受光照非均匀性的影响,具有一致性,即retinex是以色感一致性(颜色恒常性)为基础的。不同于传统的线性、非线性的只能增强图像某一类特征的方法,Retinex可以在动态范围压缩、边缘增强和颜色恒常三个方面打到平衡,因此可以对各种不同类型的图像进行自适应的增强。
根据兰德提出的理论,一幅给定的图像 S ( x , y ) S(x,y) S(x,y)可以分解为两个不同的图像:反射图像 R ( x , y ) R(x,y) R(x,y)和亮度图像(或称之为入射图像) L ( x , y ) L(x,y) L(x,y),其原理如下图所示:
对于给定图像S中的每个点 ( x , y ) (x,y) (x,y),用公式可以表示为:
S ( x , y ) = R ( x , y ) ⋅ L ( x , y ) S(x,y) = R(x,y)⋅L(x,y) S(x,y)=R(x,y)⋅L(x,y)
Retinex理论的基本思想在原始图像中,通过某种方法去除或者降低入射图像的影响,从而保留物体本质的反射属性图像。
单尺度的Retinex算法可以大致概括如下:
MSR是在SSR的基础上发展而来的,其优点是可以同时保持图像高保真度和对图像的动态范围进行压缩。MSR的计算公式如下图所示:
R ( x , y ) = ∑ K k w k { log S ( x , y ) − log F k ( x , y ) ∗ S ( x , y ) } R(x,y) =\displaystyle\sum_{K}^{k}w_k\lbrace\log S(x,y) - \log F_k(x,y)∗S(x,y)\rbrace R(x,y)=K∑kwk{logS(x,y)−logFk(x,y)∗S(x,y)}
式子中当K=1时,MSR退化为SSR,通常来说,出于保证同时兼有SSR高、中、低三个尺度的优点的考虑,K的取值通常为3。
一般来说,应用Retinex处理彩色图像是分别对 R,G,B通道进行Retinex处理将得到的结果作为R,G,B通道。这种方式对于三个通道比较均衡的图像来说效果比较好。但是有的图像就是某一通道,如R通道分量特别小,然后经过Retinex强行将R通道调整到[0,255]区间,这样效果想想也不会太好。为了克服这个缺点,人们开发了带彩色恢复的多尺度Retinex算法(MSRCR),在多尺度Retinex算法过程中,通过引入一个色彩因子C来弥补由于图像局部区域对比度增强而导致的图像颜色失真的缺陷,通常情况下所引入的色彩恢复因子C的表达式为:
R M S R C R i ( x , y ) = C i ( x , y ) R M S R i ( x , y ) R_{MSRCR_i}(x,y) = C_i(x,y)R_{MSR_i}(x,y) RMSRCRi(x,y)=Ci(x,y)RMSRi(x,y)
C i ( x , y ) = f [ I i ( x , y ) ∑ j = 1 N I j ( x , y ) ] C_i(x,y) = f \begin{bmatrix} \frac {I_i(x,y)}{\sum_{j=1}^{N}I_j(x,y)}\end{bmatrix} Ci(x,y)=f[∑j=1NIj(x,y)Ii(x,y)]
式中, C i C_i Ci表示第 i i i个通道的色彩恢复系数,它用来调整原始图像中3个颜色通道之间的比例关系,从而把相对暗的区域的信息凸显出来,以消除图像色彩失真的问题, f ( ⋅ ) f(⋅) f(⋅)表示颜色空间的映射函数。
在matlab中MSRCR算法的代码如下所示,实现了将test文件夹下所有图片去雾后存入test1文件夹中:
rt_img_dir='D:\data\test'
img_type='*.jpg'
subfolders = dir(rt_img_dir);
for ii = 1:length(subfolders)
subname = subfolders(ii).name;
if ~strcmp(subname, '.') & ~strcmp(subname, '..')
frames = dir(fullfile(rt_img_dir, img_type));
c_num = length(frames);
for i = 1:c_num
imgpath = fullfile(rt_img_dir, frames(i).name);
I = imread(imgpath);
R = I(:, :, 1);
G = I(:, :, 2);
B = I(:, :, 3);
R0 = double(R);
G0 = double(G);
B0 = double(B);
[N1, M1] = size(R);
Rlog = log(R0+1);
Rfft2 = fft2(R0);
sigma1 = 128;
F1 = fspecial('gaussian', [N1,M1], sigma1);
Efft1 = fft2(double(F1));
DR0 = Rfft2.* Efft1;
DR = ifft2(DR0);
DRlog = log(DR +1);
Rr1 = Rlog - DRlog;
sigma2 = 256;
F2 = fspecial('gaussian', [N1,M1], sigma2);
Efft2 = fft2(double(F2));
DR0 = Rfft2.* Efft2;
DR = ifft2(DR0);
DRlog = log(DR +1);
Rr2 = Rlog - DRlog;
sigma3 = 512;
F3 = fspecial('gaussian', [N1,M1], sigma3);
Efft3 = fft2(double(F3));
DR0 = Rfft2.* Efft3;
DR = ifft2(DR0);
DRlog = log(DR +1);
Rr3 = Rlog - DRlog;
Rr = (Rr1 + Rr2 +Rr3)/3;
a = 125;
II = imadd(R0, G0);
II = imadd(II, B0);
Ir = immultiply(R0, a);
C = imdivide(Ir, II);
C = log(C+1);
Rr = immultiply(C, Rr);
EXPRr = exp(Rr);
MIN = min(min(EXPRr));
MAX = max(max(EXPRr));
EXPRr = (EXPRr - MIN)/(MAX - MIN);
EXPRr = adapthisteq(EXPRr);
Glog = log(G0+1);
Gfft2 = fft2(G0);
DG0 = Gfft2.* Efft1;
DG = ifft2(DG0);
DGlog = log(DG +1);
Gg1 = Glog - DGlog;
DG0 = Gfft2.* Efft2;
DG = ifft2(DG0);
DGlog = log(DG +1);
Gg2 = Glog - DGlog;
DG0 = Gfft2.* Efft3;
DG = ifft2(DG0);
DGlog = log(DG +1);
Gg3 = Glog - DGlog;
Gg = (Gg1 + Gg2 +Gg3)/3;
Ig = immultiply(G0, a);
C = imdivide(Ig, II);
C = log(C+1);
Gg = immultiply(C, Gg);
EXPGg = exp(Gg);
MIN = min(min(EXPGg));
MAX = max(max(EXPGg));
EXPGg = (EXPGg - MIN)/(MAX - MIN);
EXPGg = adapthisteq(EXPGg);
Blog = log(B0+1);
Bfft2 = fft2(B0);
DB0 = Bfft2.* Efft1;
DB = ifft2(DB0);
DBlog = log(DB +1);
Bb1 = Blog - DBlog;
DB0 = Gfft2.* Efft2;
DB = ifft2(DB0);
DBlog = log(DB +1);
Bb2 = Blog - DBlog;
DB0 = Gfft2.* Efft3;
DB = ifft2(DB0);
DBlog = log(DB +1);
Bb3 = Blog - DBlog;
Bb = (Bb1 + Bb2 + Bb3)/3;
Ib = immultiply(B0, a);
C = imdivide(Ib, II);
C = log(C+1);
Bb = immultiply(C, Bb);
EXPBb= exp(Bb);
MIN = min(min(EXPBb));
MAX = max(max(EXPBb));
EXPBb = (EXPBb - MIN)/(MAX - MIN);
EXPBb = adapthisteq(EXPBb);
result = cat(3, EXPRr, EXPGg, EXPBb);
subplot(121), imshow(I);
subplot(122), imshow(result);
imwrite(result,strcat('D:\test1\',frames(i).name));
end
end
end
MSRCR算法具有比较好的颜色再现性、亮度恒常性与动态范围压缩等特性。它比SSR的图像增强效果更佳,色彩也更逼真,但增强效果有限。MSRCR算法处理后的图像局域对比度提高,而且其亮度与真实场景相似,图像在视觉感知下显得更为逼真。
https://blog.csdn.net/carson2005/article/details/9502053