• 562查看
  • 0回复

[规划决策] ADAS-ISP之基于直方图的LTM算法原理与C++实现

[复制链接]


该用户从未签到

发表于 26-8-2023 14:34:05 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


“现在汽车ADAS相机的动态范围可达140dB,相机HDR多帧合成之后,RAW数据的位宽可以达到24bit甚至更高。而如果后端算法计算还是使用24bit,则会带来算力的急剧提升,因此目前车载ECU上算法模块大部分还是选用8bit进行处理。再加之,目前的显示屏,大部分还是8bit位宽,也需要8bit的图像进行输入才能进行正常显示,所以需要一种色调映射算法将原始HDR图像数据映射到8bit。今天我们将介绍目前应用比较多的一种基于直方图均衡局部色调映射算法,并使用了C++将算法实现。最后文末附上了我们在github上的开源链接以供您下载参考。”
ADAS-ISP之基于直方图的LTM算法原理与C++实现w1.jpg

01—Tone Mapping概述
高动态范围图像(High-Dynamic Range,简称HDR),相比普通的图像,可以提供更多的动态范围和图像细节。在之前文章中,我们介绍了不同Sensor厂家实现HDR的方式,一般通过DOL多帧合成、DCG、SubPixel等技术来实现HDR。JOKER-EYES,公众号:ADAS之眼ADAS-CIS相机关键参数-HDR专题一般HDR Sensor在单次曝光中会产生多张的LDR(Low-Dynamic Range)图像,这里的LDR图像一般保持固定的曝光或者gain比例关系。然后,后端ISP利用每帧图像相对应最佳细节的LDR图像来合成最终HDR图像。以多曝光HDR Sensor在合成HDR图像为例,一般保持的比例关系为16:1:1/16,即每相邻帧之间就有着16倍的关系,也就是说在2进制上拓展了4个比特(16=2^4)。假如Sensor ADC是12bit的,那么在3帧曝光的情况下,最后合成HDR图像比特可以拓展到20bit(12bit+4+4),DOL合成bit扩展参考如下:
ADAS-ISP之基于直方图的LTM算法原理与C++实现w2.jpg
目前市面上,一般的显示器只有8bit,即256个灰度等级。虽然几百个灰度等级无法再现真实自然的光照情况。但最终HDR图像要在显示器中显示,后端算法还是需要对其数据进行处理的。如何处理即能充分利用这些数据,使得图像的显示尽量不丢失细节(同时保留暗部细节以及亮处细节),是多年来不少图像工作者研究的重点。简言之,现在有一张HDR图像数据,数据的分布范围很广,如0~24bit,如何把这些离散的数据映射到0到255之间,就是Tone mapping算法所做的事情。色调映射算法也分GTM(Global Tone Mapping)和LTM(Local Tone Mapping)。GTM在全局使用一个色调映射曲线,典型的如log曲线、s曲线等。
ADAS-ISP之基于直方图的LTM算法原理与C++实现w3.jpg
GTM算法普遍优点是算法简单、内存占用小、速度快,缺点是无法同时满足暗部细节以及亮部的映射需求。LTM则是将图像分块或者进行局部处理,典型的如基于分块直方图均衡、基于log平面分解的ELTM算法等。LTM算法普遍优点是普适性强、效果好,缺点是内存开销大、速度较慢。下面我们将介绍基于局部直方图实现的LTM算法与实现。
02—
基于直方图均衡的LTM算法
参考论文:《GPU-ACCELERATED LOCAL TONE-MAPPING FOR HIGH DYNAMIC RANGE IMAGES》。本文实现的C++代码,已经在github中已经开源给出,链接见文章最后,想看的同学可以访问我的github进行下载。另外,本文代码是在灰度图中进行实现,而彩色图的LTM只需要在此基础上加上YCbCr转回RGB的过程,因此想实现的同学自己动手即可,觉得代码对你的设计有用的童鞋可以给个star。算法过程:(1)切割图像,将图像沿着水平以及垂直方向切割子图像,子图越小计算量越大,当然效果也更好,这个看应用的实际需求。

ADAS-ISP之基于直方图的LTM算法原理与C++实现w4.jpg
(2)统计子图直方图并做直方图均衡,然后求解当前块的映射曲线,计算方式可以参考下式:
ADAS-ISP之基于直方图的LTM算法原理与C++实现w5.jpg
其中,ECLC分别是直方图均衡映射值以及线性压缩映射值。β是控制对比度系数,为了避免提高对比度以及减少平坦地区的噪声值,β是随着局部直方图而改变的,每个子块计算方式如下:

ADAS-ISP之基于直方图的LTM算法原理与C++实现w6.jpg
通过上述两式便可以计算出子块的初步映射值查找表(本案例是256映射到256),可以看出不同块由于区域不同映射结果也不同,如下所示:
ADAS-ISP之基于直方图的LTM算法原理与C++实现w7.jpg

(3)映射子像素值,这里注意由于子块之间映射表的不同,会导致严重的边缘效应,如下所示:

ADAS-ISP之基于直方图的LTM算法原理与C++实现w8.jpg
为了解决上述问题,在子块进行像素Mapping的时候,映射值需要结合周边的Map值做均衡处理,论文中实现的方式如下:
ADAS-ISP之基于直方图的LTM算法原理与C++实现w9.jpg
其中,HALEQ是我们通过步骤(2)得到的映射查找表,n是第几个子块,Wd是当前像素和其他子块距离的高斯平滑系数,Ws是当前块平均值和其他块平均值归一化的高斯平滑系数。
计算完毕之后可以得到LTM算法映射结果与全局直方图均衡对比如下:
原图
LTM
全局直方图均衡

ADAS-ISP之基于直方图的LTM算法原理与C++实现w10.jpg

ADAS-ISP之基于直方图的LTM算法原理与C++实现w11.jpg

ADAS-ISP之基于直方图的LTM算法原理与C++实现w12.jpg

ADAS-ISP之基于直方图的LTM算法原理与C++实现w13.jpg

ADAS-ISP之基于直方图的LTM算法原理与C++实现w14.jpg

ADAS-ISP之基于直方图的LTM算法原理与C++实现w15.jpg
可以看出,LTM在局部暗光以及亮度细节都可以保留,但是全局直方图均衡则效果差一些,如下图所示:
LTM细节
全局直方图均衡细节

ADAS-ISP之基于直方图的LTM算法原理与C++实现w16.jpg


ADAS-ISP之基于直方图的LTM算法原理与C++实现w17.jpg

当然,LTM也会有一些问题,如当图像中存在大量颜色一致色块的时候,映射则会出现断层现象,如下所示:
ADAS-ISP之基于直方图的LTM算法原理与C++实现w18.jpg

此问题后续再继续研究优化方案,感兴趣的童鞋可以继续关注。同时想要源码的同学可以在文末github链接下载,或者如果网速过慢or被墙可以后台私信回复《LTM源码》获取。

03—
结束语

今天我们为大家介绍了在ISP Pipelines中非常重要的一个模块——色调映射模块。我们复现了论文所讲述的基于直方图均衡的局部色调映射算法,介绍了算法工作原理以及流程。此外,我们使用C++语言对算法进行了代码实现与验证,并且在github上进行了开源,希望今天的讲解可以对您有所帮助。

如果您对ISP算法以及汽车电子感兴趣,欢迎继续关注本公众号。同时,如果您有想了解话题,可以后台私聊笔者,也欢迎后台进行技术沟通交流。

*本文开源代码github链接如下(感兴趣可以给个star,当然也可以给一些打赏^v^):

https://github.com/JokerEyeAdas/LTM

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 20-11-2024 19:41 , Processed in 0.255751 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.