# 基于二维伽马函数的光照不均匀图像自适应校正算法
![](./img/paper-2.png)
## 照度反射模型
入射光线 $L(x,y)$ 经过物体 $R(x,y)$ 反射后,被相机捕获,形成图像 $S(x,y)$ 。即
$$
S(x,y) = L(x,y) \cdot R(x,y)
$$
## 单尺度 Retinex
### 原理
单尺度 Retinex 即 Single Scale Retinex,它是所有基于 Retinex 方法的最简版本,原理如下:
上式两边取对数变换:
$$
\begin{array}{l}
\log S = \log \left( {L\cdot R} \right) \\
\quad \quad \; = \log L + \log R \\
\end{array}
$$
于是得到物体真实图像 $R$
$$
R = \exp{(\log S - \log L)}
$$
但是入射光线 $L$ 真实情况下是无法获取的,于是通过高斯函数进行**卷积**,获取高斯模糊图像,来近似地估算光照分量:
$$
L\left( {x,y} \right) = S\left( {x,y} \right) * G\left( {x,y} \right)
$$
于是,对于照度反射模型,可整理出一个通用的表达式:
$$
R =\exp{(\log S - \log S * G)}
$$
即给定一个输入图像 $S$ 和一个高斯函数 $G$ 就可以根据上述公式计算出物体真实图像 $R$ ,从而一定程度上对将拍摄得到的图像中光照带来的影响减弱。这里的高斯函数表达式如下:
$$
G(x,y)=\frac{1}{{2\pi{\sigma ^2}}}{e^{ - \frac{{{x^2} + {y^2}}}{{2{\sigma ^2}}}}}\
$$
且要满足归一化条件
$$
\iint {G\left( {x,y} \right)}{\text{d}}x{\text{d}}y = 1
$$
在实际操作中,卷积的实现有多种方法,其中比较快速的做法是转换到频域做乘积,因为
> 时域中(图像中通常成为空域)的卷积等于频域中的乘积
$$
\begin{array}{l}
L = S * G \\
\;\;\; = IFT\left( {FT\left( S \right)FT\left( G \right)} \right) \\
\end{array}
$$
而且通常得到的最后的 $\log{R}$ 在对数域中,尽管做指数变换可以还原得到 $R$,但图像已经减去了反应光照情况的分量,所以得到的图像视觉效果并不好,为此需要做增益补偿,通常可直接对 $log{R}$ 做一个线性拉伸处理。
$$
{R_{new}} = 255\frac{{R - {R_{\min }}}}{{{R_{\max }} - {R_{\min }}}}
$$
### 实现
```matlab
function [R,R_temp,L] = ssr4gray(S,sigma)
% S = 0 ~ 255 , 单通道图像
% R = 0 ~ 1 , 单通道图像
% R_temp = any , 用于进一步计算,避免做归一化影响结果
% S = R×L
% log(R) = log(S) - log(L)
% = log(S) - log(S*L)
G = fspecial('gaussian',size(S),sigma); % 高斯函数
% 时域卷积等于频域乘积,估计光照图像 L
%
L = real(ifft2(fft2(S).*fftshift(fft2(G,size(S,1),size(S,2)))));
L = L - min(L(:));
%}
% L = imfilter(S,G,'replicate','conv'); % 使用滤波卷积效果不好
R_temp = log(S+1) - log(L+1); % 去除光照影响
R = mat2gray(exp(R_temp)); % 线性拉伸
end
```
上述过程只能处理单通道的图像,对于三通道 RGB 图像,每一个通道做一遍即可获得 SSR 增强图像。
## 多尺度 Retinex
### 原理
可以看出单尺度 Retinex 最大的缺陷在于图像的增强效果非常依赖于高斯函数的的 $\sigma $ ,即所谓的 Retienx尺度,$\sigma $ 取值越小,高斯模糊效果越弱,光照估计的越不准,图像细节保留的越多,于是处理后的图像细节较好,但色彩严重失真;取值越大,则图像细节丢失,光照估计的越准确,处理后的图像颜色越自然,但细节丢失较多,且容易出现光晕现象。
所以为了弥补单一尺度下的这种缺陷,采取多个尺度的 SSR 进行处理,然后再对处理后的多个图像做加权求和,一定程度上实现细节和颜色方面的效果兼容。
$$
R = \sum\limits_{i = 1}^N {{\omega _i}\left( {\log S - \log S * {G_i}} \right)}
$$
这里的 $R$ 同样也是仅针对的是一个通道的处理,多通道的重复使用即可。
### 实现
```matlab
function [R,R_temp] = ssr(S,sigma)
% S = 0 ~ 255 , 三通道彩色图像
% Si = Ri×Li
% log(Ri) = log(Si) - log(Li)
% = log(Si) - log(S*Li)
% 结果初始化
R = zeros(size(S));
R_temp = zeros(size(S));
for i = 1:size(S,3)
Si = S(:,:,i); % 提取单通道图像
[~,Ri,~]= ssr4gray(Si,sigma); % 单通道 ssr
R_temp(:,:,i) = Ri; % 单通道结果存储
R(:,:,i) = mat2gray(Ri); % 单通道结果存储
end
end
```
其中,使用到了前面已经写好的单通道单尺度 Retinex 函数 `ssr4gray`
当然,我们也可以将图像转换到 HSV 颜色空间,使用多尺度 Retinex 进行增强
```matlab
function R = msr4hsv(S,sigma)
% S = 0 ~ 255 , 三通道彩色图像
% R = 0 ~ 1 , 三通道彩色图像
% RGB --> HSV
[h,s,v] = rgb2hsv(S);
V = zeros(size(v)); % 增强后亮度分量初始化
for i = 1:length(sigma)
[~, Vi]= ssr(v,sigma(i)); % 多尺度 ssr
V = V + Vi/length(sigma); % 加权求和
end
V = mat2gray(V); % 归一化
% HSV --> RGGB
R = hsv2rgb(cat(3,h,s,V));
end
```
## 带颜色恢复的多尺度 Retinex
### 原理
根据前面介绍,Retienx 算法一直致力于单通道图像的处理,对于其他通道的处理都是同样的操作,这使得通道间的分量比例明显不协调,从而失去了真彩色,图像颜色不能令人满意,于是再在多尺度 Retinex 的基础上加入了各通道之间的色彩比例调节系数,以此来恢复色彩比例。
对于第 $i$ 个通道图像 $S_i(x,y)$ 其通道色彩恢复调节系数 $C_i(x,y)$ 被表示为
$$
{C_i}\left( {x,y} \right) = \beta \log \left( {\alpha \frac{{{S_i}\left( {x,y} \right)}}
{{\sum\limits_{i = 1}^3 {{S_i}\left( {x,y} \right)} }}} \right)
$$
于是,将其与之前的多尺度 Retinex 增强图像进行相乘,调整像素取值,实现通道间色彩比例调节。
$$
{R_j} = \sum\limits_{i = 1}^N {{C_j}{\omega _i}\left( {\log S - \log S*{G_i}} \right)}
$$
这里的 $R_j$ 表示第 $j$ 个色彩通道。
### 实现
```matlab
function [R,R_temp] = msrcr(S,sigma,beta,alpha,G,b)
% S = 0 ~ 255 , 三通道彩色图像
% R = 0 ~ 1 , 三通道彩色图像
[~,R_msr] = msr(S,sigma); % 多尺度 msr
% 结果初始化
R = zeros(size(S));
R_temp = zeros(size(S));
for i = 1:size(S,3)
Si = S(:,:,i); % 提取单通道图像
Sa = sum(S,3); % 按通道求和
Ci = beta*(log(alpha*Si+1) - log(Sa+1)); % 色彩恢复系数
R_temp(:,:,i) = G*(R_msr(:,:,i).*Ci+b); % 单通道恢复结果存储
R(:,:,i) = mat2gray(R_temp(:,:,i)); % 单通道结果存储
end
end
```
其中,使用到了前面已经写好的单通道多尺度 Retinex 函数 `msr`
## 基于二维伽马函数的光照不均匀图像自适应校正算法
### 二维伽马函数
我们知道,传统的伽马矫正,就是在原图像的基础上,$\gamma$ 次幂运算,$\gamma$ 若大于 1 则图像整体会被变暗,等于 1 则保持不变,小于 1 则图像整体变亮。
$$
{R_{new}}\left( {x,y} \right) = R{\left( {x,y} \right)^\gamma }
$$
这就导致,图像是整体变化的,缺乏局部像素的考虑,因此可以针对每一个像素设置一个合适的 $\gamma$ 值,自适应地调整图像亮度。在该文章中,提出了一种新的二维伽马函数(文中公式写反了)。
$$
{\left\{ {\begin{array}{*{20}{c}}
{{S_{new}}\left( {x,y} \right) = 255\left( {\frac{{S\left( {x,y} \right)}}
{{255}}} \right)} \hfill \\
{\gamma = {{\left( {\frac{1}
{2}} \right)}^{\frac{{m - L\left( {x,y} \right)}}
{m}}}} \hfill \\\end{array} } \right.^\gamma }
$$
即,根据根据多尺度 Retinex 方法,计算出光照分量 $L$
$$
L = \sum\limits_{i = 1}^N {{\omega _i}S * {G_i}}
$$
然后依据光照分量 $L$ 计算每一个像素值的 $\gamma$ ,再将其应用在要处理的图像 $S$ 上,进行逐像素伽马矫正。
这里,论文选择将图像转换到 HSV 颜色空间,然后针对亮度分量 $V$ 使用上述方法增强后,还原图像,得到RGB增强图像。
### 实现
```matlab
function img_out = gamma2d(img_in)
% rgb --> hsv
img_in = double(img_in);
[h,s,v] = rgb2hsv(img_in);
% 多尺度光照估计
[~,~,l1] = ssr4gray(v,15);
[~,~,l2] = ssr4g
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
gamma2d-master.zip (21个子文件)
gamma2d-master
README.md 17KB
LICENSE 11KB
model
ssr.m 398B
he.m 176B
msr4hsv.m 366B
ssr4gray.m 551B
msr.m 383B
msrcr.m 492B
gamma2d.m 375B
src
场景3.png 197KB
场景1.png 136KB
Fig0310(a)(Moon Phobos).tif 296KB
灰度图像.png 94KB
场景2.png 150KB
彩色图像.png 121KB
img
paper-1.png 84KB
paper-2.png 496KB
code-2.png 512KB
code-1.png 36KB
fig.m 2KB
gamma2.py 2KB
共 21 条
- 1
TC1398
- 粉丝: 11
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0