这次和前几次一样,也是只介绍算法思路和实现步骤,再给出本人项目中Retinex的代码,Retinex的原理就不做解释。参考的论文是《Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images》
本篇参考论文把算法分为两个部分,第一个部分是全局色调映射;第二部分是局部色调映射。全局自适应这部分原理既简单又容易实现,局部自适应这部分原理不简单但是容易实现。因为我们只需要按着步骤来即可。
1、全局色调映射步骤:
本篇论文把过程写的很详细,全局映射按公式(4)即可完成,那里面的参数如何求解呢?按公式(5)即可计算出。这个算法是我实现过程中最省心的。。。。
2、局部色调映射
这部分的原理有点难理解,但是实现还是很容易的,因为他把实现公式又给我们列出来了。
首先求出α,然后实现β,最后带入公式得结果。
-------------------------------------------------------------------------------------------------------------------------------------------------------
其中的Hg(x,y)是什么呢?他也给出了说明:
Hg(x,y)就是引导滤波后的结果,可见这篇算法进行了改进,使用了引导滤波代替了高斯滤波。为什么替换?这篇论文是这么解释的:为了减少光晕伪影。为什么会减少我没有看明白。
接下来是本人项目的实现步骤,共分为五步:
第一步:色彩空间转化
第二步:全局色调映射
Lave = exp(Lsum / (1.0*rows*cols));//计算对数平均值
Mat out_image(rows,cols,CV_32FC1);//定义输出图像
double Ymax=-1e9,Ysum=0,Yave=0,Ymin=1e9;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
//记录XYZ空间下x,y,z的比率
double rateX=xyz[i][j].x/(xyz[i