Retinex图像增强算法(SSR,MSR,MSRCR)

Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法,最早由埃德温•兰德(Edwin. H. Land)于1963年提出。就跟Matlab是由Matrix和Laboratory合成的一样,Retinex也是由两个单词合成的一个词语,他们分别是retina 和cortex,即:视网膜和皮层。Land的retinex模式是建立在以下三个假设之上的:
(1)真实世界是无颜色的,我们所感知的颜色是光与物质的相互作用的结果。我们见到的水是无色的,但是水膜—肥皂膜却是显现五彩缤纷,那是薄膜表面光干涉的结果。

(2)每一颜色区域由给定波长的红、绿、蓝三原色构成的;

(3)三原色决定了每个单位区域的颜色。

Retinex理论的基础理论是物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定的,物体的色彩不受光照非均匀性的影响,具有一致性,即retinex是以色感一致性(颜色恒常性)为基础的。不同于传统的线性、非线性的只能增强图像某一类特征的方法,Retinex可以在动态范围压缩、边缘增强和颜色恒常三个方面打到平衡,因此可以对各种不同类型的图像进行自适应的增强。

一、单尺度SSR(Single Scale 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),其原理如下图所示:
Retinex图像增强算法(SSR,MSR,MSRCR)_第1张图片
对于给定图像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算法可以大致概括如下:

  1. 读取原图像,若原图为彩色图:将颜色分通道处理,每个分量像素值由整数型(int)转换为浮点数(float),并转换到对数域,取对数公式如下:
    log ⁡ S ( x , y ) = log ⁡ R ( x , y ) + log ⁡ L ( x , y ) \log S(x,y) = \log R(x,y) + \log L(x,y) logS(x,y)=logR(x,y)+logL(x,y)
  2. 通过计算图像中像素点与周围区域中像素的加权平均对图像中照度变化做估计,并将其去除,最后只保留图像中物体的反射属性,所以可用高斯模板 F ( x , y ) F(x,y) F(x,y)对原图像作卷积,即相当于对原图像作低通滤波,得到低通滤波后的图像 D ( x , y ) D(x,y) D(x,y)
    D ( x , y ) = S ( x , y ) ∗ F ( x , y ) D(x,y) = S(x,y) ∗F(x,y) D(x,y)=S(x,y)F(x,y)
  3. 原图像减去低通滤波后的图像,得到高频增强的图像 r ( x , y ) r(x,y) r(x,y)
    r ( x , y ) = log ⁡ S ( x , y ) − log ⁡ D ( x , y ) r(x,y) = \log S(x,y) - \log D(x,y) r(x,y)=logS(x,y)logD(x,y)
  4. 若原图为彩色图,则每个通道都有一个对应的 r ( x , y ) r(x,y) r(x,y)
  5. r ( x , y ) r(x,y) r(x,y)取反对数变换到实数域,最后得到增强后的图像 R ( x , y ) R(x,y) R(x,y),此时的 R ( x , y ) R(x,y) R(x,y)值的范围并不是0–255,所以还需要进行线性拉伸并转换成相应的格式输出显示。

二、多尺度Retinex(MSR)与MSRCR

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)=Kkwk{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

你可能感兴趣的:(Retinex图像增强算法(SSR,MSR,MSRCR))