资讯动态

多曝光融合原理与OpenCV实现:从HDR到金字塔权重详解

发布时间:2026/10/13 1:02:18 来源:尧图企业网站定制
拍了一组包围曝光的照片回到电脑前面对三张亮暗截然不同的JPG你脑子里想的是什么拉曲线堆栈平均值还是直接扔进某个HDR合成软件里让“假HDR”的塑料感替你作决定我一开始也是这么干的直到被重影、光晕、灰蒙蒙的画面反复折磨了几次之后才真正静下心去把“多曝光融合”这几个字的底细摸清楚。这个技术说起来并不复杂但它背后涉及的权重设计、金字塔分解、色彩空间选择能让同样一组原片产生完全不同的成片效果。这篇文章就围绕多曝光融合本身展开把它和HDR色调映射的关系理顺再把一条可以在本地完整复现的曝光融合流程从头到尾拆开讲清楚重点关注那些说明书上不会写的参数经验和踩坑经历适合正在研究计算摄影、图像融合或者单纯想把夜景大光比照片处理好一点的读者。1. 动态范围瓶颈单张照片的宽容度装不下真实光影要说清楚为什么需要多曝光得先聊一个摄影里绕不开的概念动态范围。通俗点讲动态范围就是相机能同时记录下来的“最亮”和“最暗”之间的跨度。这个跨度用EV曝光值或者档来度量每差一档亮度就差一倍。人眼在适应某个场景时的动态范围大概有20档左右而且人眼是“局部适应”的——你盯着亮的地方瞳孔会调整盯着暗处又会再调整一次相当于在脑海里自动做了好几张不同曝光的画面再拼起来。而相机传感器呢主流机型单张RAW能记录的大概在12到15档之间JPG直出往往还要更少。这就导致了一个很现实的结果你能“看见”的场景相机往往拍不下来。我举个每个人都遇到过的场景。傍晚的城市天际线天空还有晚霞地面已经是华灯初上。你用测光表或者相机评价测光对准天空地面几乎死黑对准地面路灯天空又整个过曝成白板。为什么因为天空和地面的亮度差往往在6到8档开外单张照片无论如何都装不下。直方图会告诉你最真实的答案左边顶到柱子的阴影峰右边顶到墙的高光峰中间一大段空着这张照片的信息就是“缺了一大块”。这时候有两个基本思路。第一个是物理硬扛上中灰渐变镜把天空压暗让天空和地面之间的亮度差被滤镜强行拉回传感器能接受的范围。这个方法有效但局限性也很明显场景里有高楼、树、山脊等复杂轮廓时渐变镜的过渡硬边界很容易穿帮。第二个思路就是拍多张在不同曝光值下拍摄同一场景每张照片只负责记录它最擅长的亮度区间暗部细节交给长曝光那张高光细节交给短曝光那张然后在后期把几张照片的有用像素“挑”出来合成一张完整的画面。这就是“多曝光”的本质——用多次采样的方式扩展单帧的动态范围。这个思路听起来很简单但真正执行起来有个核心问题到底怎么“挑”像素才能挑得自然、挑得没有接缝这就派生出了两条技术路线一条叫HDR合成后色调映射另一条就是本文的主角——曝光融合。两条路线平时经常被混着叫但在算法路径上完全不同。理解它们的差异你才知道什么场景用什么方案最省事、效果最好。2. 曝光融合与HDR的路线之争不是一回事但很多人混着用先说说经典的多帧HDR合成流程。第一步拍一组不同曝光的LDR低动态范围图像第二步利用相机响应函数的逆变换把这些LDR图像映射到真实的辐射度空间生成一张高动态范围的HDR图像通常存储为浮点格式比如Radiance RGBE第三步因为这张HDR图像超出了普通显示器的亮度范围你需要用色调映射Tone Mapping算法把它压回8位的SDR图像。这个过程里“合并成HDR”和“色调映射”是两个独立步骤而且必须有一堆参数要调比如响应曲线标定、映射曲线强度、局部对比度恢复程度等等。调得不好画面就会呈现那种典型的“HDR感”——边缘光晕、对比度失真、颜色饱和度溢出噪点被映射成砂砾质感。曝光融合走的是另一条路。它直接对多张LDR图像做加权混合根据每个像素在每张图里的“质量”来分配权重。一个像素如果在这张图里曝光良好、细节丰富那它就在最终结果里拿走更大的比例如果是那张更亮的图里曝光刚好合适那它就去那边“借”像素。整个过程不构建浮点HDR辐射度图也没有色调映射步骤输入还是那几张8位JPG或者PNG最后输出还是一张8位图。它的核心算法代表就是Mertens等在2007年发表的那篇曝光融合论文——这篇论文后来被OpenCV封装成了cv2.createMergeMertens()也是我想在这篇文章里重点展开的东西。这两条路线到底该怎么选我给一个比较主观但很实用的判断标准如果最终产物是做显示器或手机观看的视觉画面而且场景相对静态、没有需要严格物理光度量化的需求曝光融合通常比“HDR合成色调映射”更稳、更快、更容易保持自然色彩如果你要做光度量测、HDR显示内容制作、或者想基于辐射率做计算机视觉分析那就老老实实走HDR合成路线因为融合算法输出的LDR图像里曝光信息已经被“重新编码”了拿去做定量分析会出问题。下面是两条路线在几个关键维度上的对比。对比维度多帧HDR合成 色调映射曝光融合处理流程LDR → 辐照度估计 → HDR → Tone Mapping → SDRLDR → 权重计算 → 多尺度融合 → SDR中间数据浮点HDR图数据量较大无直接在LDR域操作参数调校响应曲线、映射曲线、局部对比度等多个环节权重指数、金字塔层数等少量参数视觉风格可控性强偏戏剧化需专业调校更容易保持原始曝光氛围风格自然计算量相对更重尤其是局部色调映射轻量适合实时或低算力部署动态对鬼影需要单独做去鬼影对齐同样需要但融合失败模式更温和适用场景极极端光比、定量分析、HDR显示日常空间摄影、手机HDR、快速出片那我这篇文章下文讲的Mertens曝光融合就是表里右边这条技术路线的标准实现。它有明确的数学骨架可以直接从论文落到代码里。把它的内部机制和实现细节吃透之后你再回头处理那些大光比照片就不会再被“HDR是不是都要调出油画感”这个问题困住了。3. Mertens曝光融合的机制权重设计、金字塔分解、重建曝光融合看起来只是做加权平均但如果你直接把多张图按权重做逐像素混合会发现一个恼人的问题——融合出来不是一片死灰就是在明暗交界处出现惨白色的“接缝”或者发虚的伪影。原因很简单逐像素权重完全没有空间一致性不同曝光图的权重大小变化太剧烈尤其在场景边缘和高光轮廓线附近像素级的权重切换就会导致色彩和亮度的突变。Mertens算法的巧妙之处就在于引入了两个机制来解决这个问题一个是从对比度、饱和度、曝光良好度三个维度设计权重另一个是把普通像素级融合改成拉普拉斯金字塔域的多尺度融合。3.1 三个决定权重的质量指标Mertens权重公式的形式是W(x,y) C(x,y)^wc * S(x,y)^ws * E(x,y)^we其中C是对比度、S是饱和度、E是曝光良好度wc、ws、we是对应的三个指数参数。这三个指标分别干这么几件事对比度C一般取灰度图的拉普拉斯滤波器响应或者梯度幅值。对比度高的地方纹理清晰、边缘锐利天然应该优先从这张图里取像素。比如石墙的纹路、叶脉、建筑窗棂这些位置如果某张图里对比度高说明这个亮度区间在这张图里记录得最实在。饱和度S把RGB三个通道做标准差离散程度越大表示颜色越饱和。常见做法是(max(R,G,B)-min(R,G,B))或者各通道标准差的均值。彩色场景中颜色浓郁的地方说明感光元件得到了足够的颜色信噪比很少会出现“彩色噪点淹没颜色细节”的问题。曝光良好度E衡量一个像素离中间灰值域中点0.5有多近通常用exp(-(I-0.5)^2/(2σ^2))的高斯函数来描述σ一般取0.2。为什么要离中间灰近因为太暗的区域噪声大、色偏严重太亮的区域高光容易剪切掉信息而0.5附近的曝光对绝大多数相机来说都处于线性感光最理想、信噪比最高的区间。把三个指标连乘起来每张图在每个像素位置就有一个权重值。这三个指数wc、ws、we的取值决定了你更看重细节、色彩还是“正常曝光”。默认配置是wc1、ws1、we1但实际使用中有不少调优空间我下面会专门讲。3.2 权重图必须先归一化和平滑计算完每张图的权重图之后不能直接拿去做融合。你需要把三个权重归一化让每个像素位置的权重总和为1。归一化公式是W_k(x,y) W_k(x,y) / Σ_j W_j(x,y)这里的j遍历所有输入曝光图。如果不做归一化结果会被权重大小牵鼻子走亮的图因为曝光良好度天然高可能直接带偏整张画面的平均亮度这显然不是我们想要的。更关键的一步是归一化后的权重图需要做低通滤波或者下采样平滑让权重在空间上缓慢变化。这个操作的意义在于普通像素级的权重切换太剧烈但如果我们先把每一层的权重图降采样成低分辨率版再逐层融合就相当于强制权重在一个较大的空间范围内保持相对稳定从而避免权重的生硬跳跃。这也是为什么Mertens算法要用金字塔实现多尺度融合的核心原因——金字塔天然给了你一层比一层更平滑的权重表示。3.3 金字塔为什么能消除融合伪影要理解金字塔融合的价值先分清两个概念高斯金字塔和拉普拉斯金字塔。高斯金字塔比较好理解把原图连续做高斯模糊加下采样得到一组分辨率逐层减半的图像序列。每一层都是上一层的“模糊缩略图”保留的是大尺度的低频结构信息。而拉普拉斯金字塔其实是相邻两层高斯金字塔之间的差值第i层的拉普拉斯图像等于第i层高斯图像减去上采样后的第i1层高斯图像。这么一减拉普拉斯金字塔的每一层就只保留该尺度下的高频细节——比如边缘、纹理、线条而不携带大尺度的整体亮度信息。融合过程是这样的对每一张输入曝光图都计算其拉普拉斯金字塔对每一张对应的权重图计算其高斯金字塔。然后在每一层金字塔上先把该层的所有拉普拉斯图像做权重加权融合得到该层的融合拉普拉斯图像最后从最顶层开始逐层把融合结果上采样并与下一层细节累加重建出最终的融合图像。这相当于把“挑选像素”的任务分解到了多个尺度。大尺度的亮度过渡由金字塔高层决定小尺度的细节过渡由金字塔低层决定。即使底层权重变化剧烈因为高层已经确定了平滑的亮度基调重建出来的图像也不会出现明显的断层或鬼影边缘。这个“多尺度重建”就是曝光融合比逐像素加权稳定得多的关键原因。3.4 为什么这套机制在实际场景里就是稳这套流程有一个现实好处即使某一张曝光图的某个区域权重非常高由于融合发生在金字塔不同尺度上高权重区域在多个尺度上保持了连续渐变最终输出的接缝是不可见的。换句话说拉普拉斯金字塔的“可逆重建”特性保证了图像在亮度和颜色上不会有累计误差。更重要的是整个过程没有经过浮点HDR辐射度编码也没有色调映射曲线所以颜色自然度保留得特别好。我经常跟朋友讲曝光融合出来的片子有一种“所见即所得”的平和感而HDR色调映射则更像“电影幕后调色师的手笔”两种风格各有拥趸但融合这种风格在建筑摄影和自然风光里更吃香。4. 用Python和OpenCV手写一个多曝光融合工具理论讲清楚之后落到代码才是关键。我平时用Python比较多OpenCV提供了完整的金字塔接口和MergeMertens封装但我建议你至少自己手写一遍核心的权重和金字塔重建流程因为只有亲手拆过一遍你才能理解那些参数的物理含义也才能在出问题时知道该调哪里。4.1 环境准备与输入数据依赖非常简单opencv-python、numpy如果要读入RAW可以先转成线性TIFF再做融合。拍摄输入建议使用三脚架固定机位拍摄一连串不同曝光值的照片。如果你用相机自带AEB包围曝光功能常见的是±1EV、±2EV三张或五张如果手动拍我建议至少拍三张一张保证高光不溢出但暗部死黑一张保证中间调正常一张保证暗部有细节但高光彻底过曝。这样的“高-中-低”三张组合已经能让融合结果有足够的信息量。读图的代码很简单import cv2 import numpy as np def load_images(paths): images [] for p in paths: img cv2.imread(p, cv2.IMREAD_COLOR) if img is None: raise FileNotFoundError(f无法读取 {p}) # 统一转成float32数值范围[0,1] img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32) / 255.0 images.append(img) return images有一个细节值得注意cv2.imread读进来的是BGR通道顺序而我们在做色彩相关计算时最好是在RGB顺序下进行尤其是要计算饱和度和做Lab转换的时候。代码里先转成RGB再熬成float后面所有计算都会更顺手。4.2 权重图计算的实现接下来实现三个权重指标。对比度我用拉普拉斯算子的响应绝对值饱和度我用RGB三通道的标准差曝光良好度用高斯函数评价距离0.5中间灰的程度。实现如下def compute_weight_maps(images, wc1.0, ws1.0, we1.0, sigma0.2): weight_maps [] for img in images: gray cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 对比度拉普拉斯响应的绝对值 contrast cv2.Laplacian(gray, cv2.CV_32F) contrast np.abs(contrast) # 饱和度通道标准差 mean np.mean(img, axis2, keepdimsTrue) sat np.sqrt(np.mean((img - mean) ** 2, axis2)) # 曝光良好度离中间灰越近权重越大 expo np.exp(-(gray - 0.5) ** 2 / (2 * sigma ** 2)) weight (contrast ** wc) * (sat ** ws) * (expo ** we) weight np.clip(weight, 1e-12, None) # 防止0权重的log问题 weight_maps.append(weight) # 归一化 weight_sum np.sum(weight_maps, axis0) weight_maps [w / weight_sum for w in weight_maps] return weight_maps这里有一个常见误区拉普拉斯响应会有一部分负值区域如果你直接用负值结果参与乘方运算会导致在高频细节区域权重反而偏低或出现负数进而让权重图出现“边缘反转”。我的处理习惯是先取绝对值再用。这个细节很小但直接决定你的权重图会不会在边缘处出现一圈“暗边”。4.3 金字塔分解与融合重建接下来是金字塔。高斯金字塔的构造我用OpenCV的pyrDown逐层下采样拉普拉斯金字塔则是每层高斯图与上采样后的上一层做差。为了控制代码长度下面是一个紧凑但完整的实现def gaussian_pyramid(img, levels): gp [img] for _ in range(levels - 1): gp.append(cv2.pyrDown(gp[-1])) return gp def laplacian_pyramid(img, levels): gp gaussian_pyramid(img, levels) lp [] for i in range(levels - 1): expanded cv2.pyrUp(gp[i 1]) if expanded.shape[0] gp[i].shape[0] or expanded.shape[1] gp[i].shape[1]: expanded expanded[:gp[i].shape[0], :gp[i].shape[1]] lp.append(gp[i] - expanded) lp.append(gp[-1]) # 顶层直接用高斯残差 return lp def reconstruct_from_laplacian(lp): levels len(lp) img lp[-1] for i in range(levels - 2, -1, -1): img cv2.pyrUp(img) if img.shape[0] lp[i].shape[0] or img.shape[1] lp[i].shape[1]: img img[:lp[i].shape[0], :lp[i].shape[1]] img cv2.add(img, lp[i]) return imgpyrDown和pyrUp在尺寸不是严格的2的倍数时会出现一点尺寸偏差所以我在代码里做了裁切处理。这个坑如果不处理重建出来的图像会有一圈像素错位边缘发虚很多人最后查了半天才发现是尺寸没对齐。现在把权重图也转成高斯金字塔然后逐层融合拉普拉斯金字塔def fuse_images(images, levels5, wc1.0, ws1.0, we1.0): weight_maps compute_weight_maps(images, wcwc, wsws, wewe) # 对每张图构建权重高斯金字塔和图像拉普拉斯金字塔 fused_pyr None for idx, img in enumerate(images): w weight_maps[idx] wp gaussian_pyramid(w, levels) lp laplacian_pyramid(img, levels) if fused_pyr is None: fused_pyr [np.zeros_like(l) for l in lp] for i in range(levels): fused_pyr[i] lp[i] * wp[i] result reconstruct_from_laplacian(fused_pyr) return np.clip(result, 0.0, 1.0)这段实现的核心逻辑就两件事输入图像的拉普拉斯金字塔乘上权重图的高斯金字塔逐层累加然后用重建函数把累加后的金字塔恢复成图像。为什么权重要用高斯金字塔而图像要用拉普拉斯金字塔这个问题在3.3讲过了——权重需要平滑的低频信息来约束大尺度趋势而图像需要把高频细节分离出来单独加权这样才能避免细节处的权重突变产生伪影。4.4 参数调节的真实经验代码跑通之后你会发现三个参数对成片质量的影响非常直观。wc对比度指数调大画面细节更锐利边缘更突出但调过头会出现“嵌边”感像过度锐化的那种白边ws饱和度指数调大色彩更浓郁但暗部容易发灰因为暗部本来饱和度就低强行提权重反而得不偿失we曝光良好度指数调大画面更偏向“标准曝光平均”但过大的we会让高光和阴影区域落在权重极低的位置画面变平缺少层次。我个人的默认参数组合是这样的常规场景wc1.0, ws1.0, we1.0完全够用遇到“天空高光快溢出地面较暗”的日落场景把we提到1.2左右让曝光合适的区域拿更多权重遇到纹理复杂的场景比如树林、砖墙把wc提到1.2到1.5细节会更扎实。金字塔层数levels对于2000万像素左右的照片5层足够小图用4层大尺寸长图可以用6层但再往上收益就很微弱了计算量反而明显增加。5. 实践路上的坑鬼影、光晕、白平衡与对齐读到这里你应该已经能跑出一个基本可用的多曝光融合工具了。但真拿它去处理现实拍摄的素材马上就会撞上几个绕不开的“现实毒打”动态物体的重影、高光区域的晕影、多帧之间的白平衡漂移以及手持拍摄带来的普遍对齐误差。这些坑如果不处理再完美的金字塔重建也救不回来。5.1 场景静止是前提鬼影到底怎么破曝光融合非常依赖“场景内容不变”这个前提。你按了三张包围曝光中间任何一张里的树叶被风吹动了、汽车开过去了、行人走路了融合结果里就会出现半透明的“幽灵”——那辆汽车在画面里既是这个位置又是那个位置树叶的边缘模糊成一片墨迹。这就是最常见的鬼影ghosting现象。最直接的办法是物理上规避拍摄时优先选无风、无车流、人少的时段用三脚架快门尽量用遥控器或者倒计时。但现实里总有避不开的情况。软件层面最简单的去鬼影思路是做一致性检测计算每张图每个像素点相对参考帧一般选中间曝光那张的偏差如果偏差超过一定阈值就认为这个像素属于动态区域这部分像素不再米用该图的权重直接让其他帧来决定。用极值法的思路是在每个像素位置取所有帧的最小值和最大值如果一个像素在某帧里超出了这个区间说明它是异常像素就把它的权重压低。def detect_motion_masks(images, ref_idx1, thresh0.1): ref images[ref_idx] masks [] for img in images: diff cv2.absdiff(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY), cv2.cvtColor(ref, cv2.COLOR_RGB2GRAY)) masks.append((diff thresh).astype(np.float32)) return masks把masks乘到对应权重图上做软掩码再归一化就能在融合时自动忽略动态区域。注意掩码需要做一次高斯模糊比如cv2.GaussianBlur(mask, (5,5), 0)让它从0到1之间平滑过渡否则融合边界又会多出一条硬边。这个方案做不到商业级去鬼影水准但对付树叶晃动和轻微人流足够了。5.2 大光晕从哪里来权重半径与金字塔层数打开融合结果在高光边缘附近出现一圈“发亮的边”看起来像是物体周围涂抹了荧光这是光晕伪影halo。光晕的来源主要有两个一个来自权重图在空间上的急剧变化另一个来自金字塔层数不足导致的高频信息混叠。如果你在权重图中使用了过大的高斯模糊半径会让高权重的暗部区域“扩散”到高光区域的开外重建后就会形成亮边。相反如果金字塔层数太浅低频结构没法被充分分离融合时局部区域会被某一帧的大权重直接接管边缘就会产生过冲。解决光晕的实践要领是权重图的模糊半径不要超过图像短边尺寸的1/50左右金字塔层数至少4层对于2000万像素级别的一般我会用5层甚至6层。另外如果你发现光晕主要集中在明暗边界处试着提高wc的权重让边缘细节更多地由对比度主导这能在一定程度上把光晕压制下去。5.3 白平衡漂移三张图变成三种色调多曝光拍摄有个隐蔽问题——如果相机白平衡设定在自动档每次曝光之间相机会自适应调整白平衡尤其隔着玻璃拍夜景或者拍夕阳时三张图的色温可能完全不同。融合完成之后你很可能得到一张色彩发灰、偏青或者偏品红的图。这种色偏不是融合算法的锅而是输入数据本身不一致。我的做法是在融合之前先做白平衡归一化。简单粗暴但有效的方法选参考帧一般选中间曝光那张计算每张图在灰色区域的平均RGB比例然后把其他帧的通道按比例缩放到与参考帧一致。如果不想这么麻烦更稳妥的方式是拍RAW在转换阶段统一白平衡后再进融合流程。RAW工作流下你完全可以让三张图的白平衡一模一样色彩一致性从源头解决。5.4 手持拍摄怎么办对齐是融合的前置条件三角架不是每次都有的手持拍三张包围曝光每张之间手会有轻微位移。如果没有对齐直接融合结果必然发虚细节处还有叠影。简单有效的对齐方案有几种相位相关可以估计全局平移但不能处理旋转和透视变化ECC增强相关系数可以处理小角度旋转加平移对于更复杂的手持抖动光流对齐是更普适的选择。我平时最快的方法是把三张图缩成小尺寸比如宽400像素然后对亮度分量用cv2.findTransformECC算一个2x3的仿射变换矩阵再把矩阵放大回原图尺寸做cv2.warpAffine。跑一次实测下来普通手持轻微抖动基本都能对齐到亚像素级足以撑起曝光融合。如果抖动太大比如你按快门时人还晃了一下仿射变换就顶不住了那种情况下除非上光流否则还是建议老老实实上三脚架。5.5 色彩空间RGB直接融合色偏警告另一个容易被忽略的坑在色彩空间。如果你直接对RGB三通道做拉普拉斯金字塔融合偶尔会在饱和色区域发现色彩从红过渡到紫、从蓝过渡到绿之类的异常。原因很简单RGB三个通道之间高度相关融合时三通道各自的权重并不一致亮度差异被三通道独立放大色彩平衡就被打破了。我建议的替代方案是把图像从RGB转到Lab空间L通道代表亮度a和b代表色度。融合只在L通道上做a、b通道直接取参考帧的值或者做一个简单的线性混合。这样亮度细节完全由融合金字塔决定色彩则保持参考帧的一致性色偏问题基本可以避免。代价是色彩层次会略“平”一点但对绝大多数场景来说这个取舍非常划算。6. 曝光融合和现代成像的配合手机HDR、RAW工作流与选型思路讲到这儿你应该已经发现多曝光融合其实不只是电脑上一门“后期技术”它完整地映射了现代成像系统里各种“多帧增强”的底层逻辑。手机上的夜景模式、HDR模式本质上就是实时版的曝光融合多帧快速连拍、对齐、权重融合然后在ISP里做后续调色。虽然手机端还有去模糊、超分辨率等更多花活但金字塔多尺度加权融合这个框架依然是核心。如果你经常拍RAW我强烈建议你试试把RAW先转成线性TIFF再做曝光融合。这么做的好处有两个第一线性色彩空间下权重计算更接近物理一致高光区域不再因为JPG的S曲线而被压缩失真第二RGB的数值范围在融合时能得到更好的物理意义实验结果通常更细腻。代价是线性图直方图看起来“发灰发暗”这是正常的融合完成后加一条适当的色调曲线做对比度恢复就好。关于“曝光融合”和“多帧HDR合成”的选型我的最后建议是这样一张决策表最终用途是发社交媒体、冲洗打印、做普通修图素材 → 直接曝光融合流程短、风格自然、不容易出假HDR效果。最终用途是做高动态范围显示器内容、光度量测、基于辐射度图像做视觉算法分析 → 走“HDR合成色调映射”或直接存储浮点HDR格式。场景里有大量树叶、水面反光、人流等复杂动态 → 优先考虑带运动掩码的曝光融合或者干脆用更重的去鬼影流程。合成速度很重要比如移动端处理 → 降低金字塔层数、简化权重层次用轻量化融合框架。我最近在做的一个模拟项目里需要把一组五张包围曝光的户外场景融合成一张同时保留高光细节和阴影层次的教学图片素材。一开始用的就是cv2.createMergeMertens()三分钟出片效果已经不错后来手动把权重里的对比度指数换成拉普拉斯希伯尔特空间度量的变体细节保留和边缘自然度又上了一个小台阶。这些细节差异在像素级对比上也许不明显但在放大检视时非常能说明问题。曝光融合是个很成熟的领域但它留给个人去调校和玩花样的空间依然大得很——把基础原理吃透之后上面说的权重设计、金字塔层数、色彩空间选择每一项都可以往里继续深挖。对做计算摄影或者图像融合方向的人来说这套方法值得花一个下午从头到尾亲手实现一遍。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑