HDR(High Dynamic Range,高动态范围),由于目前无论是相机还是显示器,对图像亮度范围都限定在0~255之间,即256个亮度级别,但在自然界中,刺眼的阳光和微弱的星光,可能有成千上万倍的亮度差异。如果要在同一张照片上同时呈现两个亮度差异较大的物体,那么实际情况是,要么其中一个亮度过低,或者另一个过曝。根据不同应用场景,HDR有不同处理方式。

其中一种方法为,采用不同曝光参数(ISO、快门速度)拍摄同一场景照片,对每张照片相同位置像素值求和,计算平均值,再将均值赋值给对应像素;另一种类似的处理方法为,相机采用较为平衡的曝光参数拍摄一张照片,根据这张照片分别按照亮度增强一定比例和亮度降低一定比例生成两张影像,将三张影像按照前面一种方法进行处理。

当然在实际处理同一位置拍摄多张影像进行HDR时,需要考虑抖动等外界因素造成的图像错位,需要引入特征提取与匹配及裁剪影像。

简单的demo实现代码:

public class Hdr {/*** HDR实现 不同曝光参数的几张照片实现影像画质增强* * @param images* @return*/public BufferedImage hdrByImages(BufferedImage[] images) {int width = images[0].getWidth();int height = images[0].getHeight();BufferedImage resultImage = new BufferedImage(width, height, images[0].getType());int length = width * height;int pics = images.length;int[] tempR = new int[length];int[] tempG = new int[length];int[] tempB = new int[length];// 取出每张照片对应位置像素值for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {int index = i * height + j;for (int k = 0; k < pics; k++) {int rgb = images[k].getRGB(i, j);tempR[index] += (rgb >> 16) & 0xff;tempG[index] += (rgb >> 8) & 0xff;tempB[index] += rgb & 0xff;}}}// 求取均值,将均值作为最终结果输出for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {int index = i * height + j;int r = tempR[index] / pics;int g = tempG[index] / pics;int b = tempB[index] / pics;int rgb = (255 & 0xff) << 24 | (r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff);resultImage.setRGB(i, j, rgb);}}return resultImage;}/*** 用一张照片进行HDR计算* * @param image* @param lightParam*            提高亮度参数* @param darkParam*            降低亮度参数* @return*/public BufferedImage hdrByimage(BufferedImage image, double lightParam, double darkParam) {BufferedImage[] images = new BufferedImage[3];images[0] = image;images[1] = brightnessAdjustment(image, lightParam);images[2] = brightnessAdjustment(image, darkParam);BufferedImage result = hdrByImages(images);return result;}// 亮度调整public BufferedImage brightnessAdjustment(BufferedImage image, double param) {BufferedImage resultImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());double R, G, B;for (int i = 0; i < image.getWidth(); i++) {for (int j = 0; j < image.getHeight(); j++) {int rgb = image.getRGB(i, j);R = (((rgb >> 16) & 0xff) * param);G = (((rgb >> 8) & 0xff) * param);B = ((rgb & 0xff) * param);rgb = ((255 & 0xff) << 24) | ((clamp((int) R) & 0xff) << 16) | ((clamp((int) G) & 0xff) << 8)| ((clamp((int) B) & 0xff));resultImage.setRGB(i, j, rgb);}}return resultImage;}private int clamp(int i) {if (i > 255) {return 255;}if (i < 0) {return 0;} else {return i;}}// 读取文件夹下多张影像public BufferedImage[] readImages(File input) throws Exception {String[] files = input.list();BufferedImage[] images = new BufferedImage[files.length];for (int i = 0; i < files.length; i++) {String in = files[i];File file = new File(input.toString() + "/" + in);images[i] = ImageIO.read(file);}return images;}//测试public static void main(String[] args) throws Exception {File input = new File("C:/Users/admin/Desktop/test/HDR");BufferedImage[] images = new Hdr().readImages(input);BufferedImage result = new Hdr().hdrByImages(images);File output = new File("C:/Users/admin/Desktop/test/HDR/result.jpg");ImageIO.write(result, "jpg", output);}
}

三张不同曝光参数的测试图像:

运行结果:

高动态范围图像HDR相关推荐

  1. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 python实现

    (9条消息) 局部边(9条消息) 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 matlab程序(一)_ 本文程序根据论文"Gu B, Li W, Zhu M, et al. Loca ...

  2. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 matlab程序(一)

    本文为转载,原博客地址为:http://blog.csdn.net/majinlei121/article/details/50420927 本文程序根据论文"Gu B, Li W, Zhu ...

  3. 高动态范围(HDR)

    from:http://www.cnblogs.com/walespeng/p/4201433.html 高动态范围(HDR) 高动态范围(High-Dynamic Range,简称HDR),又称宽动 ...

  4. 高动态范围图像是什么

    HDR(High-Dynamic Range,译为高动态范围图像)是一个被大量抛出的术语,似乎从来没有真正得到解释.你看在你的手机拍摄 HDR 照片,电视显示 HDR 视频,这究竟意味着什么?它代表高 ...

  5. 双冠!网易互娱AI Lab包揽NTIRE 2022高动态范围成像(HDR)两项冠军

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:网易互娱 AI Lab 点击进入-> CVer 微信技术交流群 近日网易互娱 AI Lab 获得 ...

  6. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  7. 高动态范围图像-单图

    高动态范围图像-单图 左侧是原图,右侧是处理后的图

  8. 一种基于视神经网络的高动态范围(HDR)图像自适应局部色调映射的实现【OpenCV】【CUDA】

    原理是基于这篇论文--<Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images> 论文提出的背 ...

  9. Unity3d HDR和Bloom效果(高动态范围图像和泛光)

    文章开始先放两组效果,文章结尾再放两组效果 本文测试场景资源来自浅墨大神,shader效果为本文效果 HDR 人们有限的视觉系统,只支持16.7百万的颜色,超出这个范围的颜色就不能显示了 bmp或jp ...

最新文章

  1. 用Java语言编写ajax设计模式_使用JavaScript发布订阅设计模式实现Ajax请求节流
  2. ubuntu虚拟机开机无法进入系统(initramfs)
  3. Spring - Java/J2EE Application Framework 应用框架 第 13 章 集成表现层
  4. bufferedimage生成的图片模糊_Kaptcha图片验证码工具
  5. make时候说找不到makefile_优秀自律的句子:找不到理由继续的时候,就找个理由重头来过吧...
  6. golang 切片追加问题
  7. 泰山挑夫1(菜鸟题解)
  8. nginx linux详细安装部署教程,Nginx Linux详细安装及部署实战
  9. Windows核心编程笔记
  10. GitHub中文排行榜
  11. 仿 qq音乐播放器 html代码,仿QQ音乐播放器
  12. yolo系列外文翻译_yolov3论文中英对照版
  13. PXE + KS 实现系统自动部署系统
  14. 我对“结构化思维”的理解 - 直播分享
  15. 学习是怎样的一个过程??
  16. 3D建模软件应该学中文版还是英文版?Maya软件应该学中文版还是英文版?
  17. 迷你世界箱子里物品无限取
  18. bp验证码爆破插件二改
  19. PYqt5制作登陆界面
  20. pandas读取webd的csv文件

热门文章

  1. leetcode -- 357. Count Numbers with Unique Digits
  2. 小白也能学会的 Git 常用指令指南
  3. linear-gradient radical-gradient详解
  4. 【最优解】Leecode 594. 最长和谐子序列——Leecode每日一题系列
  5. 【GIF动画+完整可运行源代码】C++实现 选择排序——十大经典排序算法之二
  6. 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)
  7. Spring注解 (更新中)
  8. html flash 循环播放,在网页中插入flv格式的flash视频怎么让其循环播放_html/css_WEB-ITnose...
  9. java条件运算符类型转换_Java运算符,条件表达式,类型转换
  10. 华为BGP动态路由协议理论