HDR tone mapping介绍

news2024/11/24 20:34:59

文章目录

    • HDR and tone mapping
      • 1.什么是HDR?
      • 2.为什么需要HDR?
      • 3.hdr文件格式
      • 4.tone mapping
        • 4.1 aces tone mapping
        • 4.2 Fast Bilateral Filtering for the Display of High-Dynamic-Range Images
      • 5 参考

HDR and tone mapping

1.什么是HDR?

就是高动态图像。如何体现
查看 https://www.easyhdr.com/examples/ 这个网站上的例子:

在这里插入图片描述

3张曝光融合为一张, 似乎是挑出不同曝光图像中比较清晰的部分 进行融合。
比如选了 第一张欠曝图像中 的高光蓝天部分, 选了第二三张过曝图像 中的 一些低亮度 海岸部分。 最终融合一张 整体亮度适中的 HDR图像:这样既能看清蓝天,也能看清海岸。

那么是不是可以通过调整第二张图像的亮度来达到 HDR的效果呢? 比如压制高光蓝天,提亮低光海岸。答案也是可以的,有一些深度学习的方法也是这么做的,单张HDR或者图像增强。

如下面的例子:
在这里插入图片描述

2.为什么需要HDR?

因为现实场景的动态范围非常大,人眼的动态范围也比较宽广, HDR技术可以更好的表达场景,更好的符合人眼感知

在这里插入图片描述

sdr和 hdr图像:
在这里插入图片描述

3.hdr文件格式

hdr文件 是 float32类型,记录的是场景的亮度,与辐射是线性关系。
在 改网站上可以显示hdr图像:https://viewer.openhdr.org/

比如拖入nave.hdr文件可以得到:
在这里插入图片描述

右上角是曝光调节,可以看到不同曝光条件下的 图像。

这里我用python 实现了上面网站类似的效果:

根据不同的ev, 提取一定范围内直方图的数据,展示图片。

在这里插入图片描述

提取 乘上(2^ev)之后的[0, 1]范围内数据

img = np.clip(data * (2 ** ev), 0, 1) ** (1/2.2)

在这里插入图片描述

完整code:

def compute_luminance(input: np.ndarray):
    luminance = 0.2126 * input[:, :,
                         0] + 0.7152 * input[:, :,
                                       1] + 0.0722 * input[:, :, 2]
    return luminance


def map_luminance(input: np.ndarray, luminance: np.ndarray,
                  new_luminance: np.ndarray):
    output = np.zeros(input.shape)

    output[:, :, 0] = input[:, :, 0] * new_luminance / luminance
    output[:, :, 1] = input[:, :, 1] * new_luminance / luminance
    output[:, :, 2] = input[:, :, 2] * new_luminance / luminance
    return output

if __name__ == "__main__"
    file = r'D:\code_color\HDR-Tone-Mapping-and-Image-Upscaling-main\test image\hdr_images\vinesunset.hdr'
    data = cv2.imread(file, cv2.IMREAD_ANYDEPTH)[..., ::-1]
    print('rgb data info ')
    print(data.shape, data.dtype, data.min(), data.max(), data.mean())

    L = compute_luminance(data)
    print('L info ')
    print(L.shape, L.dtype, L.min(), L.max(), L.mean())

    L_log = np.log2(L)
    print('L log info ')
    print(L_log.shape, L_log.dtype, L_log.min(), L_log.max(), L_log.mean())

    bin_low = L_log.min()
    bin_high = L_log.max()
    bins_num = 500
    hist2, bins2 = np.histogram(L_log, bins_num, [bin_low, bin_high])

    plt.figure(figsize=(10, 3))
    plt.title("complete hist")
    plt.plot(np.linspace(bin_low, bin_high, bins_num), hist2, 'r-')
    plt.show()


    num_ev = 4
    hist_s = []
    img_s = []
    evs = -np.linspace(bin_low+4, bin_high, num_ev)
    print('evs : ', evs)
    for ev in evs:
        L0 = L * (2 ** ev)
        hist, bins= np.histogram(np.log2(L0), bins_num, [bin_low, bin_high])
        print(L0.min(), L0.max())
        img = np.clip(data * (2 ** ev), 0, 1) ** (1/2.2)

        hist_s.append(hist)
        img_s.append(img)


    # 画图
    plt.figure(figsize=(10, 3*num_ev))
    for i in range(len(evs)):
        ev = evs[i]
        hist = hist_s[i]
        ax = plt.subplot(num_ev, 1, i+1)
        ax.plot(np.linspace(bin_low, bin_high, bins_num), hist, 'r-')
        ax.plot((0, 0), (0, 0.6*hist.max()), 'k-')
        ax.set_title(str(np.round(ev, 2)))
        plt.xlim([bin_low, bin_high])

    plt.figure()
    for i in range(len(evs)):
        ev = evs[i]
        img = img_s[i]
        ax = plt.subplot(2, (num_ev+1)//2, i+1)
        ax.set_title(str(np.round(ev, 2)))
        plt.imshow(img)
    plt.show()

4.tone mapping

hdr的数据 覆盖的亮度比较大,而一般的传统设备可能无法显示 hdr数据(比如只能显示8bit的 sdr数据)

可以想到的是直接对hdr数据进行归一化,然后乘上255进行显示。但是这样显示有一个问题,就是比如一个hdr数据很多细节都在 比较小的数据上,如下图直方图所示:
在这里插入图片描述

这个时候线性归一化后,图像会整体比较暗,如下图:
在这里插入图片描述

一个正常的tone mapping方法可以得到正常的图像:
在这里插入图片描述

tone mapping 就是将hdr数据映射到 sdr设备上的方法。

在 这篇博客中有介绍一些常见的tone mapping方法:
比如Reinhard tone mapping, aces tone mapping等, 好像都是S-curve形状。

4.1 aces tone mapping

这里实现aced tone mapping 看下效果

在这里插入图片描述

def aces_tone_mapping(x):
    a = 2.51
    b = 0.03
    c = 2.43
    d = 0.59
    e = 0.14
    return (x * (a * x + b)) / (x * (c * x + d) + e)


def map_luminance(input, luminance, new_luminance, s=1):
    output = ((input / luminance[..., None])**s) * new_luminance[..., None]
    output = np.clip(output, 0, 1)
    return output

if __name__ == "__main__"
    # aces tone mapping
    x = L
    y = aces_tone_mapping(x)
    out_aces = map_luminance(data, x, y, 1)
    out_aces = out_aces ** (1 / 2.2)

    plt.figure()
    plt.subplot(121)
    plt.xscale('log')
    plt.plot(x[::100, ::100], y[::100, ::100], '+')

    plt.subplot(122)
    plt.imshow(out_aces)
    plt.show()

4.2 Fast Bilateral Filtering for the Display of High-Dynamic-Range Images

Durand and Julie Dorsey 基于 滤波 和 分层的 tone mapping方法
算法原理如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IjkwRsN2-1682410919356)(2023-04-25-15-17-55.png)]

仿真实验效果:
在这里插入图片描述

python code:

def fast_bilateral_tone_mapping(data):
    contrast = 10
    L = compute_luminance(data)
    chrome = data / L[..., None]

    log_intensity = np.log10(L)

    base_layer = bilateral_filter(log_intensity, 7, 50, 50)

    detail_layer = log_intensity - base_layer

    compression_factor = np.log10(contrast) / (base_layer.max() - base_layer.min())
    log_abs_scale = base_layer.max() * compression_factor
    out_log_lum = base_layer * compression_factor + detail_layer - log_abs_scale
    out_lum = np.power(10, out_log_lum)

    out = chrome * out_lum[..., None]
    out = np.clip(out, 0, 1) ** (1 / 2.2)
    print('out : ', out.min(), out.max())
    plt.figure()
    plt.subplot(231)
    plt.title('map curve')
    plt.plot(L.reshape(-1)[::100], out_lum.reshape(-1)[::100], '.')

    plt.subplot(232)
    plt.title('L')
    plt.imshow(L, 'gray')

    plt.subplot(233)
    plt.title('chrome')
    plt.imshow(chrome)

    plt.subplot(234)
    plt.title('base')
    plt.imshow(base_layer, 'gray')

    plt.subplot(235)
    plt.title('detail_layer')
    plt.imshow(detail_layer, 'gray')

    plt.subplot(236)
    plt.title('out')
    plt.imshow(out)
    plt.show()


    return out
fast_bilateral_tone_mapping(data)

https://sites.google.com/site/ianschillebeeckx/cse555/hmwk1

5 参考

https://cloud.tencent.com/developer/article/1167088?areaSource=103001.6&traceId=r3KPIA5AV5GmTN3HDENpZ 色域映射介绍: HDR关键技术—色域映射
https://cloud.tencent.com/developer/article/1358173?areaSource=103001.5&traceId=r3KPIA5AV5GmTN3HDENpZ HDR关键技术:逆色调映射

本文主要介绍和了解hdr文件,以及tone mapping概念。
关于如何生成 HDR , tone mapping 算法, inverse tone mapping 方法等没有过多的介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx + springboot 实现限流

1.spring项目打成jar包后,运行起来 :例如我启动项目 ip 端口号:172.168.0.217:8090 2.修改nginx配置,增加如下配置 nginx 中有两个主要的指令可以用来配置限流:limit_req_zone 和 limit_req upstream myserver{serve…

面试篇:Redis

一、缓存穿透 1、缓存穿透 查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。即:大量请求根本不存在的key 2、查询流程 3、出现原因 业务层误将缓存和库中的数据删除了,也可能是有人恶…

3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机

3台服务器StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机 我们通常讲的“超融合(HCI)”是一种云平台基础架构方案,它无需专用的存储设备, 每台服务器既承担计算又存储数据, 只需增加服务器&…

SpringMVC-RESTful架构风格

目录 RESTful架构风格 1、RESTful概述 2、RESTful的六大原则 3、RESTful的实现 4、HiddenHttpMethodFilter RESTful风格的CRUD 1、环境搭建 2、功能需求 3、功能:访问首页 4、功能:查询所有数据 5、功能:删除一条数据 6、功能&…

Web服务

安装 WEB 服务; ~ 服务以用户 webuser 系统用户运行; ~ 限制 web 服务只能使用系统 500M 物理内存; ~ 全站点启用 TLS 访问,使用本机上的“CSK Global Root CA”颁 发机构颁发,网站证书信息如下: C…

财报解读:涅槃重生之后,新东方还想再造一个“文旅甄选”?

新东方逐渐走出了“微笑曲线”。 图源:新东方2023财年Q3财报 2023年4月19日,新东方披露了2023财年Q3财报(截至2023年2月28日止),营收7.5亿美元,同比增长22.8%;归母净利润为8165万美元&#xff…

2023年4月份上新的视频领域分割模型设计系列论文(附下载链接)

来源:投稿 作者:王老师 编辑:学姐 论文1 论文标题: Boosting Video Object Segmentation via Space-time Correspondence Learning 论文链接: https://arxiv.org/pdf/2304.06211v1.pdf代码链接:暂未开源 …

QGIS数据可视化学习笔记02——CSV数据和表连接

在其他的GIS软件中,表的连接操作是十分常用的操作,在QGIS中也是一样的,接下来我们介绍QGIS中属性表之间的连接以及如何添加CSV数据到属性表中。 1、表的连接 &emsp如关系型数据库一样,两表连接的前提是,两个表中都…

使用大模型进行代码阅读——关于LLaMA模型代码的一些思考

使用大模型进行代码阅读 关于LLaMA模型代码的一些思考 关于这个模型的代码其实挺简单的,如果了解transformer decoder的代码,这个代码理解起来相对会比较容易一些,但是在这个代码里面有几个问题,是自己的一些思考或者是疑问点吧…

【NLP教程】用python调用百度AI开放平台进行情感倾向分析

一、背景 Hi,大家!我是 马哥python说 ,一名10年程序猿。 今天我来演示一下:通过百度AI开放平台,利用python调用百度接口进行中文情感倾向分析,并得出情感极性分为积极、消极还是中性以及置信度结果。 二…

HTB-Cache

HTB-Cache 信息收集80端口 立足www-data -> ashash -> luffyluffy -> root 信息收集 80端口 主页是一些hacker的介绍。 作者介绍能收集可能的用户名ASH以及有一个其他项目可能有用,如下: “Check out his other projects like Cache:HMS(Hosp…

【Python小技巧】使用Gradio 构建基于ChatGPT的AI绘图 Web 应用(附源码)

文章目录 前言一、Gradio是什么?二、使用Gradio构建基于ChatGPT的 Web 应用1. 安装gradio库2. 安装openai库(ChatGPT的python库)3. Web 应用示例(源代码) 总结 前言 都说ChatGPT也可以生成图片,好奇的我也…

母婴市场竞争激烈,如何通过软文营销脱颖而出

如今,随着宝宝数量增加以及人们对孩子的重视程度的增加,母婴市场愈发火爆。然而,母婴行业的竞争也越来越激烈,企业需要不断开拓新市场才能生存。在这样的情况下,软文营销成为了母婴企业拓展市场的一种有效方式。 首先&…

Docker Compose的安装教程、使用教程示例

Docker Compose的安装教程、使用教程示例 安装教程下载修改权限创建软链测试是否安装成功 使用教程1: 定义python应用2.创建容器的Dockerfile文件3.定义docker-compose脚本web容器:redis容器: 4.使用Compose构建并运行您的应用程序5.访问浏览器 安装教程…

【人体姿态估计】(一)原理介绍

【人体姿态估计】(一)原理介绍 一、背景 人体姿态估计本质上是一个关键点检测的项目; 关键点检测在生活中的应用十分广泛,包括人脸识别、手势识别,而人体姿态估计则是对身体的关键点进行检测; 本文将介…

Python学习中更适合中国宝宝的报错整理~

人生苦短,我用python 最近有很多小伙伴说实在是看不懂报错的类型, 这次就给大家整理好了基本上玩python会遇到的报错问题 更适合中国宝宝体制喔~ python 安装包资料:点击此处跳转文末名片获取 在python中不同的异常可以用不同的类型 (pyt…

【Python小技巧】使用Gradio构建基于ChatGPT的 Web 应用(附源码)

文章目录 前言一、Gradio是什么?二、使用Gradio构建基于ChatGPT的 Web 应用1. 安装gradio库2. 安装openai库(ChatGPT的python库)3. Web 应用示例(源代码) 总结 前言 随着人工智能的不断发展,各种智能算法越…

爆料一家互联网中厂的年终奖,真香。

前不久刷到宇宙条32岁员工14万的月薪截图,突然想起来已经快四月底了,正是各大互联网公司年终奖开奖的时候,但相比以往,今年互联网圈好像安静了很多。各种“凡尔赛”的年终奖金额刷屏的情况不复存在。 各家大厂都暗戳戳地分完了奖…

js实现iframe框架的面包屑功能

js实现iframe框架的面包屑功能 什么是iframe框架什么是面包屑面包屑的js实现思路代码实现小结 什么是iframe框架 iFrame全称Inline Frame是HTML中的一个标签,用于在一个HTML文档中嵌入另一个HTML文档。iFrame框架可以将一个HTML文档嵌入到另一个HTML文档中的一个独…

后代选择器

知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" c…