【对比度增强】Learning Tone Curves for Local Image Enhancement(LTMNet)

news2024/12/23 10:05:23

文章目录

  • 0. 前言
  • 1. 理解
    • 1.1 整体框架
    • 1.2 网络结构
    • 1.3 细节
  • 2. 亮点
  • 3. 总结

0. 前言

LTMNet这篇文章借鉴了CLAHE算法,所有步骤与CLAHE一致,不同之处在于LTMNet中局部映射曲线是通过CNN预测得到,而CLAHE中是通过直方图均衡化而得。关于CLAHE,【数字图像处理】直方图均衡化这篇博客有简单介绍。
论文:Learning Tone Curves for Local Image Enhancement
代码:https://github.com/samsunglabs/ltmnet

1. 理解

所谓看文先看图,这里选择关键的几张图来理解文章的思想。

1.1 整体框架

LTMNet的整体pipline如下:
在这里插入图片描述
输入一张图像,resize到512×512,输入到网络中,输出M*N个RGB三通道的映射曲线,每个通道的映射曲线是一维的查找表;然后将得到的映射曲线应用到图像并进行插值,得到色调映射后的图像。以上就是完整的推理过程,训练时仅仅多了一个求loss的步骤。

为什么要插值:如果每个块使用对应的曲线进行映射,那么在块与块的交界处会产生不自然的过渡,因此需要通过插值使得交界处过渡平滑。

上图看下来,一般会有两个地方比较疑惑:① 网络是如何预测映射曲线的?② 插值是如何操作的?下面会进行解释。

1.2 网络结构

首先,网络是如何预测映射曲线的呢?网络的结构如下图所示,输入512×512×3的图像,经过卷积和池化后得到8×8×768的输出,其中8×8表示grid size,即将图像划分为8×8块;768表示RGB三通道的查找表,由于像素值的范围为0~255,因此查找表的长度为256。
在这里插入图片描述

1.3 细节

得到网络输出的映射曲线后,如何应用到输入图像上以实现对比度增强呢?文章中给出的图中解释的比较清楚。
在这里插入图片描述

以2×2的grid size为例,即将输入图像分为4块,每块对应着3×256的映射曲线,分别记为 t 1 t_1 t1 t 2 t_2 t2 t 3 t_3 t3 t 4 t_4 t4。论文中的后处理方式与CLAHE一致,将每一小块继续划分为2×2个小块,所以2×2的图像就变成了4×4的图像,如下:
在这里插入图片描述
将图像划分为角落区域(橙黄色)、边界区域(绿色)和中心区域(蓝色),每个区域使用不同的映射规则。

  • 对于角落区域(Corner region):直接使用所在大块的映射曲线。 p c p_c pc是位于左下角的一个像素,因此使用 t 3 t_3 t3进行映射即可,得到输出 p ^ c = t 3 ( p c ) \hat{p}_c=t_3(p_c) p^c=t3(pc)
    在这里插入图片描述
  • 对于边界区域(Border region):选择所在块和相邻块的映射曲线对像素进行映射,然后通过插值计算最终的结果,插值的权重根据像素到块边界的距离来衡量。 p b p_b pb是位于下边界区域的像素,因此使用 t 3 t_3 t3 t 4 t_4 t4两条映射曲线对其进行映射,然后通过插值得到映射后的像素值 p ^ b \hat{p}_b p^b
    在这里插入图片描述
  • 对于中心区域(Center region):使用中心四个块的映射曲线 t 1 t_1 t1 t 2 t_2 t2 t 3 t_3 t3 t 4 t_4 t4分别对像素 p m p_m pm进行映射,然后通过插值获取结果 p ^ m \hat{p}_m p^m
    在这里插入图片描述

2. 亮点

由于网络输出的是查找表,即映射曲线,因此可以交互式地对图像的局部区域进行调整,以达到想要的效果。例如下图中图像暗区过暗,通过调整曲线将亮度拉起来,使得暗区细节可见。
在这里插入图片描述

3. 总结

  • 传统算法与神经网络结合,神经网络拟合色调映射函数
  • 设计算法时要考虑到实际应用环境,如ISP pipline中,一个很重要的点就是算法需要具备可调性,因为用户需要针对自己的偏好以及使用环境的不同对算法的效果进行调整

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

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

相关文章

MySQL_第10章_创建和管理表

第10章_创建和管理表 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能…

【C++11】智能指针

目录 一、异常层层嵌套执行流乱跳容易导致内存泄漏 二、使用智能指针解决上述问题 1、RAII 2、像指针一样 3、智能指针RAII运算符重载 三、C98的auto_ptr 四、C11的unique_ptr和shared_ptr 1、unique_ptr唯一指针 2、shared_ptr共享指针 2.1shared_ptr是否线程安全 …

MySQL_第09章_子查询

第09章_子查询 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。 SQL 中子查询的使用大大…

计算机组成原理 作业5

作业5 题量: 21 满分: 100 作答时间:03-23 09:45至03-29 23:59 91.7分 一. 单选题(共11题,35分) 1. (单选题, 3分)计算机的存储器采用分级存储体系的主要目的是________。 A. 便于读写数据B. 便于系统…

NetSuite Sublist解释

今朝汇编一下Sublist主题的知识点以备忘。 2个数据源类型 Related Record - 以Saved Search建立的关联记录;Child Record - 父子表; 1. Related Record Saved Search关键点 这种形式的Sublist是利用Saved Search作为Sublist的数据源,将某…

【群智能算法】一种改进的白鲸优化算法IBWO【Matlab代码#17】

文章目录 1. 原始BWO算法1.1 勘探阶段1.2 开发阶段1.3 鲸落阶段 2. 改进白鲸优化算法2.1 Tent映射种群初始化2.2 反向学习策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 1. 原始BWO算法 BWO算法的种群初始化和大多数智能算法相同,即随机产生搜索空间中的若干候选…

python协程实战

协程简介 协程(Coroutine)又称微线程、纤程,协程不是进程或线程,其执行过程类似于 Python 函数调用,Python 的 asyncio 模块实现的异步IO编程框架中,协程是对使用 async 关键字定义的异步函数的调用; 一个进程包含多个线程,类似…

MySQL学习笔记第三天

第04章 运算符 1.算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加()、减(-)、乘(*)、除(/)和取模&a…

13、go并发编程

目录 一、并发模型二、MPG并发模型三、Goroutine的使用1 - 协程使用2 - panic与defer 四、channel的同步与异步‘’1 - 同步与异步channel2 - 关闭channel 五、并发安全性1 - 资源竞争2 - 原子操作3 - 读写锁4 - 容器的并发安全 六、多路复用1 - 阻塞I/O2 - 非阻塞I/O3 - 多路复…

差分(一维+二维)

类似于数学中的求导和积分,差分可以看成前缀和的逆运算。 前缀和我们是求原数组的前缀和,这里是把原数组当成前缀和,构造一个差分数组来运算 以一维为例,如原数组为a[1],a[2],a[3]...a[n] 前缀和的思想是构造st[1]a[1],st[2]a[…

【C++】vector的使用

文章目录 1. 主要结构2. 构造函数与复制重载3. 迭代器4. 容量相关1.容量读取2.容量修改 5. 数据访问6. 数据修改1. 尾插尾删2.任意位置的插入删除 7.其他接口 在之前我们学习了string的使用与模拟实现,在参考文档中可以发现,vector和string以及其他的容器…

I/O 设备

CPU有两种方法访问IO设备 都是基于PMIO的,Port Mapped I/O 给IO总线上的寄存器编号,CPU向IO总线请求写入或读取数据 (x86)给特定的内存地址对应上目标IO设备,当CPU读取这段内存的时候,就会把访问转发给IO…

微服务 - Consul服务注册中心

概述 上篇说到构建良好的架构,依托于基础设施建设(自动化测试、自动化部署、服务监控,服务发现、配置中心等等),决定成败的往往是基础设施建设,所以从搭建一个注册中心和配置中心开始我们新一阶段的启程。 注册中心 注册中心选型…

Cordic算法原理详解

目录 坐标旋转分析 Cordic算法原理 应用举例1:求sin值与cos值 应用举例2:求反正切值 cosθ的还原补偿 坐标旋转数字计算机CORDIC(COordinate Rotation DIgital Computer)算法,通过移位和加减运算,能递归计算常用函数值&#…

《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

runsAvail runsAvail用于记录long型的指针值,是一个LongPriorityQueue数组,LongPriorityQueue的结构如下: array数组用于存储handle的值,其中下标对应SizeClasses中pageIdx,size为array数组的大小,size的大…

1.13|1.14|1.15|1.6、GDB调试

1.13|1.14|1.15|1.6、GDB调试 1.13、GDB调试(1),GDB调试(2)1. 什么是GDB2. 准备工作3. GDB命令—启动、推出、查看代码实际操作①用list查看代码 1.15、GDB调试(3)1. GDB命令—断点操作实际操作…

Redis 快速上手 Java 增删改查(包含 RedisTemplateConfig 的编写)

一:Redis 数据类型 先了解 redis 的五种基本数据类型。 String 字符串类型:name: "value1"List 列表:names: ["value1", "value2", "value2"]Set 集合:names: ["value1", &qu…

多源迁移学习网络补充知识用于具有不可见故障的机器智能诊断

**摘要:**当前基于深度迁移学习的故障诊断的大多数成功需要两个假设:1)源机器的健康状态集合应当与目标机器的健康状态集合重叠;2)目标机器样本的数量跨健康状态平衡。然而,这样的假设在工程场景中是不现实的&#xff…

【闲聊杂谈】HTTPS原理详解

HTTPS和HTTP的区别 HTTP虽然使用极为广泛, 但是却存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付, 网络交易等新兴应用中安全方面最需要关注的。 关于 HTTP的明文数据传输, 攻击者最常用的攻击手法就是网络嗅探, 试图从传输过程…

Redis高可用高性能缓存的应用系列06 - 热Key,大Key,并发竞争解决方案

概述 终于迎来了Redis系列的尾声,本文针对Redis常遇到的热Key,大Key,并发竞争解决方案进行介绍。 热Key 什么是热key?当一个key的访问量明显大于其他key的时候,他就可以被称为热key。 热Key带来的问题 热key占用大量的CPU资…