一种快速简单而又有效的低照度图像恢复算法

《Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images  》的文章提出的主要内容时这对高动态图像的显示问题,他结合传统的Retinex技术提出了全局自适应和局部自适应的HDR实现过程,我也实现了整个的代码,但感觉前面的全局适应方案特别对于低照度图像有着非常明显的调节作用,因此,我重点谈下整个。

直接应用原文的英文算了:

 Global adaptation takes place like an early stage of the human visual system [4]. The human visual system senses rightness as an approximate logarithmic function according o the Weber-Fechner law [5]. To globally compress the ynamic range of a HDR scene, we use the following function n (4) presented in [5].

  用中文解释下上面的公式,也是本文最重要的一个公式。

  是全自适应输出的结果,我们这里就是需要得到他,表示输入图像的luminance值(亮度值),表示输入图像亮度值对的最大值,表示输入亮度对数的平均值,如下式所示:

  

  其中N表示像素的总数,而δ一般是个很小的值,其作用主要是为了避免对纯黑色像素进行log计算时数值溢出,这个问题在图像处理时非常常见。

  在log域进行计算,这个HDR算法中基本是个定律了。

  直接应用原文的话,上述算式的主要作用是:

The input world luminance values and the maximum luminance values are divided by the log-average luminance of he scene. This enables (4) to adapt to each scene. As the log-verage luminance converges to the high value, the function converges from the shape of the logarithm function to the near function. Thus, scenes of the low log-average luminance reboosted more than scenes with high values. As a result, the overall scene luminance values are adequately compressed in ccordance with the log-average luminance of the scene.

  特别注意的是 scenes of the low log-average luminance reboosted more than scenes with high values. 这句话,他的意思是说低照度的亮度部分比高照度的部分要能得到更大程度的提升,所以对于低照度图,上述公式能起到很好的增强作用。而算式中使用了全局的对数平均值,这就有了一定的自适应性。

  我贴一段稍微修改了的作者共享的matlab代码作为本算法的参考代码:

function outval = ALTM_Retinex(I)
II = im2double(I);
Ir=double(II(:,:,1)); Ig=double(II(:,:,2)); Ib=double(II(:,:,3));
% Global Adaptation
Lw = 0.299 * Ir + 0.587 * Ig + 0.114 * Ib;% input world luminance values
Lwmax = max(max(Lw));% the maximum luminance value
[m, n] = size(Lw);
Lwaver = exp(sum(sum(log(0.001 + Lw))) / (m * n));% log-average luminance
Lg = log(Lw / Lwaver + 1) / log(Lwmax / Lwaver + 1);
gain = Lg ./ Lw;
gain(find(Lw == 0)) = 0;
outval = cat(3, gain .* Ir, gain .* Ig, gain .* Ib);
figure;
imshow(outval)

改写成python代码为:

#simple color balance
def simple_color_balance(input_img,out_img,s1,s2):h,w = input_img.shape[:2]sort_img = input_img.copy()one_dim_array = sort_img.flatten()#转化为一维数组sort_array = sorted(one_dim_array)#对一维数组按升序排序per1 = int((h*w)*s1/100)minvalue = sort_array[per1]per2 = int((h*w)*s2/100)maxvalue = sort_array[(h*w)-1-per2]#实施简单白平衡算法if(maxvalue<=minvalue):for i in range(h):for j in range(w):out_img[i,j] = maxvalueelse:scale = 255.0/(maxvalue-minvalue)for m in range(h):for n in range(w):if(input_img[m,n] < minvalue):out_img[m,n] = 0elif(input_img[m,n] > maxvalue):out_img[m, n] = 255else:out_img[m, n] = scale*(input_img[m,n]-minvalue)#映射中间段的图像像素def ALTM(img):h,w = img.shape[:2]DouImg = array(img,dtype=float32)Lw = zeros(img.shape[:2],dtype = float32)log_Lw = zeros(img.shape[:2],dtype = float32)Img_out = zeros(img.shape,dtype=uint8)B = img[:,:,0]G = img[:,:,1]R = img[:,:,2]Dou_B = array(B, dtype=float32)Dou_G = array(G, dtype=float32)Dou_R = array(R, dtype=float32)Lw = 0.299*R+0.587*G+0.114*BLwmax = Lw.max()log_Lw = log(0.001+Lw)Lw_sum = log_Lw.sum()Lwaver = exp(Lw_sum/(h*w))Lg = log(Lw/Lwaver+1)/log(Lwmax/Lwaver+1)#simple_color_balance(Lg, Lg, 2, 3)gain = Lg/LwDou_B = gain * Dou_BDou_G = gain * Dou_GDou_R = gain * Dou_R##对于某些图像来说可能这个效果会好些simple_color_balance(Dou_B,Dou_B,2,3)simple_color_balance(Dou_G, Dou_G, 2, 3)simple_color_balance(Dou_R, Dou_R, 2, 3)DouImg = cv2.merge([Dou_B,Dou_G,Dou_R])Img_out=cv2.convertScaleAbs(DouImg)return Img_out

运行结果:

参考文献:

SSE图像算法优化系列二十:一种快速简单而又有效的低照度图像恢复算法。

Adaptive Local Tone Mapping Based on Retinex

一种快速简单而又有效的低照度图像恢复算法相关推荐

  1. 荧光和明场图像融合 matlab,一种用于明场显微成像的多层图像融合算法

    一种用于明场显微成像的多层图像融合算法 [技术领域] [0001] 本发明涉及图像处理技术领域,特别涉及一种用于明场显微成像的多层图像融合 算法. [背景技术] [0002] 当前对细胞形态表型研宄的 ...

  2. 一种用于三维物体建模的精确、鲁棒的距离图像配准算法

    论文标题:An Accurate and Robust Range Image Registration Algorithm for 3D Object Modeling 作者:Yulan Guo, ...

  3. 服务器单系统盘和双系统盘,一种比较简单快速的硬盘全新安装Win10单双系统的方法...

    Win10预览版9879发布不久,不过对于期待了许多的用户们来说,还是觉得有点慢,不过还好总算是出来了.在迫不及待的下载好了Win10预览版9879后,该如何进行安装呢?通过镜像ISO文件安装Win1 ...

  4. 三种快速转换PDF为TXT的方法:简单、高效、免费

    如何将PDF转换为TXT文件?在日常生活中,PDF和TXT是常见的文本格式.PDF格式文件具有稳定的布局和易于存储的特点.然而,许多在线下载的电子书通常是以PDF格式提供的,而电子阅读器通常不支持PD ...

  5. java sleep方法_6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  6. 高考数学考用计算机求函数吗,高考数学52种快速做题方法整理!再也不用担心考试时间不够了...

    原标题:高考数学52种快速做题方法整理!再也不用担心考试时间不够了 1 . 适用条件 [直线过焦点],必有ecosA=(x-1)/(x+1),其中A为直线与焦点所在轴夹角,是锐角.x为分离比,必须大于 ...

  7. 计算机上根号5怎么打,根号怎么打(5种快速输入√与×号的方法)

    根号怎么打(5种快速输入√与号的方法) 1.alt+数字 我们双击单元格,进入数据输入的状态,这个时候只需要按下alt+指定的数字就能快速的输入对勾对叉号,这个利用的ASCII编码,Windows系统 ...

  8. One-Stage Visual Grounding之一种快速准确的单阶段视觉定位

    One-Stage Visual Grounding之一种快速.准确的单阶段视觉定位方法 前言 两阶段框架存在的缺陷 单阶段视觉定位的优点 单阶段视觉定位的方法 视觉和文本特征编码 空间特征编码 融合 ...

  9. matlab去除大跳变,一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码)...

    一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码) 一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码) 文章目录 前言 一.MATLAB代码 二.结果示例 总结 前言 方法 ...

最新文章

  1. php switch换界面,php switch的“高级”用法详解
  2. 静态服务器显示固定页面,【Python高级编程034 ● 静态web服务器 ● 静态Web服务器-返回固定页面数据】...
  3. STM32,CAN总线过滤器的设置详细讲解
  4. DirectionalLayout线性布局
  5. Vue004_条件渲染
  6. 计算机视觉课_计算机视觉教程—第4课
  7. python 合并word文件,在Python上的WordCloud中,我想合并两种语言
  8. 如何在Ubuntu中屏蔽一个网站
  9. 一个项目三个坑,我懵了
  10. 【学堂在线数据挖掘:理论方法笔记】第10天(4.4)
  11. python(12)给文件读写上锁
  12. matlab皮尔逊和斯皮尔曼,利用matlab计算Pearson和Spearman相关系数
  13. 2013-1-30 六级词汇造句
  14. 问题PermissionError [Errno 13] Permission denied解决方法
  15. Zabbix5.0如何发送短信
  16. python3 工作上一些正则表达式
  17. 计算机网络 有效数据率,在计算机网络中,表征数据传输有效性的指标是( ) A.误码率 B.频带利用率 C.信道容量 D.传输速率...
  18. Android音视频视频基础(H264)二 SPS分析
  19. anaconda打不开怎么办
  20. RxJava 与 Retrofit 结合的最佳实践

热门文章

  1. imple-unpack---攻防世界
  2. Ubuntu 16.04系统安装VS Code流程详解
  3. 字符串生成条码(CODE128),并实现在水晶报表上的条码打印!
  4. 电脑怎么保存网页到桌面上使用
  5. win10怎么开启aptx_索尼1000XM3 无线主动降噪耳机一周上手体验Windows10开启aptX方法...
  6. 计算机毕业设计ssm家具商城hog7l系统+程序+源码+lw+远程部署
  7. DPDK Rx flexible descriptor 在Intel E810 网卡中的使用
  8. 输入法中表情和小图标的应用
  9. 前端js数组元素的筛选,修改,新增属性小技巧一---前端数据筛选filter()函数,更新数组map()函数;
  10. 7000词汇这么背我比较可以接受,连续看20天足以