Retinex是一种基于生物学视觉系统的图像增强算法,旨在模拟人眼对图像的感知。Retinex算法通过分解图像的反射分量和亮度分量来提高图像的对比度和亮度。其中,单尺度Retinex增强算法是Retinex算法中的一种变体。
单尺度Retinex增强算法基于以下假设:图像中的每个像素是由反射和亮度两个部分组成的,反射部分表示物体表面的颜色和亮度,而亮度部分表示光照条件。算法将图像分解为反射分量和亮度分量,通过对反射分量进行局部对比度增强和动态范围压缩,来提高图像的对比度和亮度。
具体而言,单尺度Retinex增强算法通过以下步骤实现图像增强:
- 将输入图像转换为对数空间(log空间),将图像中的每个像素从原始像素值转换为对数像素值。
- 对转换后的图像进行高斯模糊,以模糊图像中的高频噪声。
- 计算图像的反射分量,通过将模糊后的图像与原始图像进行除法运算得到。
- 对反射分量进行局部对比度增强,通过使用高斯滤波器计算局部对比度权重,并将权重应用于反射分量。
- 对增强后的反射分量进行动态范围压缩,将反射分量中的灰度值映射到[0,1]的范围内。
- 计算图像的亮度分量,通过将原始图像除以反射分量得到。
- 将增强后的反射分量和亮度分量相乘,得到最终的增强图像。
Image=(imread('1.jpg'));
%读取彩色图像,提取出红、绿、蓝三个通道的像素值。
subplot(1,3,1), imshow(Image), title('原始图像');
[height,width,c]=size(Image);
RI=double(Image(:,:,1)); GI=double(Image(:,:,2)); BI=double(Image(:,:,3));
%对每个通道的像素值进行高斯滤波,得到估计的光照分量。
sigma=100; filtersize=[height,width]; gaussfilter=fspecial('gaussian',filtersize,sigma); Rlow=imfilter(RI,gaussfilter,'replicate','conv');
Glow=imfilter(GI,gaussfilter,'replicate','conv');
Blow=imfilter(BI,gaussfilter,'replicate','conv');
%将估计的光照分量归一化到0到1之间,并将三个通道合并成一张彩色图像
minRL=min(min(Rlow)); minGL=min(min(Glow)); minBL=min(min(Blow)); maxRL=max(max(Rlow)); maxGL=max(max(Glow)); maxBL=max(max(Blow));
RLi=(Rlow-minRL)/(maxRL-minRL);
GLi=(Glow-minGL)/(maxGL-minGL);
BLi=(Blow-minBL)/(maxBL-minBL);
Li=cat(3,RLi,GLi,BLi);
subplot(1,3,2), imshow(Li), title('估计光照分量');
%通道的像素值进行对数变换,得到强光照下的图像,并将三个通道合并成一张彩色图像。
Rhigh=log(RI./Rlow+1);
Ghigh=log(GI./Glow+1);
Bhigh=log(BI./Blow+1); SSRI=cat(3,Rhigh,Ghigh,Bhigh);
subplot(1,3,3), imshow(SSRI), title('单尺度Retinex增强');