• 扩展的多曝光图像合成算法及其在单幅图像增强中的应用。


      在拉普拉斯金字塔在多图HDR算法中的应用以及多曝光图像的融合算法简介一文中提高的Exposure Fusion算法,是一种非常优秀的多曝光图片合成算法,对于大部分测试图都能获取到较为满意的结果,但是也存在着两个局限性:

      1、存在着Out-of-range Artifact;

            2、存在着low frequency halo;

      为了解决这两个问题,Charles Hessel在2019年发表了一篇名为《Extended Exposure Fusion》的论文,基本上有效的避免了《Exposure Fusion》的这两个缺陷,并且以此为基础,将Exposure Fusion扩展到了单幅图像的增强中。

      在IPOL网站中,有对这两篇文章的详细资料和在线测试程序,详见:

      http://www.ipol.im/pub/art/2019/278/      Extended Exposure Fusion

      https://www.ipol.im/pub/art/2019/279/     Simulated Exposure Fusion

      我们不去过多的分析他们的原理,只是大概的描述下论文的细节吧,更为详细的可以直接阅读论文本身。

      一、Extended Exposure Fusion

      这个文章虽然篇幅有十几页,但是实际上核心的东西就是一个:无中生有,即我们从原始的图像数据序列中fu在继续创造更多的图像,然后利用Exposure Fusion合成,这些新创造出的图像相对于原始的图具有更低的动态范围,具体的过程为:

      确定一个参数Beta,有效范围是[0,1],然后根据Ceil(1.0 / Beta)向上取整得到我们需要重新创建的图像的数量M,这个Beta我们称之为动态范围。新创建的M个图像的生产方法如下:

       对于序列中的每一个值,我们计算一个参数:        

                                              

       作为需要压缩的动态的范围的中心,当原始的像素值t在范围内时,线性映射,即t不变化,当不在此范围时,按以下公式计算新的t值。

                                   

      其中    , 以及 ,这样就保证像素不在我们设定的动态范围时,像素值不会断崖式的裁剪,而是平滑的予以变化,从而使得融合的结果不会太突兀。

      以下时Beta = 0.5/0.34/0.25时对应的重新映射的曲线图,可以看到随着Beta的值的变小,新创建的图像数量M不断地增加,但是不管如何,所有图像组合在一起,都覆盖了原图的所有的动态范围(即合并后的映射图总会有一条45倾斜的直线),而Beta值的含义页可以从曲线总可以看出就是直线段的长度,即每幅图动态范围保持不变的部分。

           Beta = 0.5, M = 2              Beta = 0.34, M = 3                 Beta = 0.25, M = 4

       注意,以上的映射等行为的公式都是针对归一化后的图像数据的,即要将图像由[0,255]先映射为[0,1]。

      如果原始图像序列由N幅图像,则这样处理就增加为了N*M幅图,后续就是对这N*M幅进行标准的比曝光融合了。因此可以明显的看出,这个算法的速度要比Exposure Fusion至少慢M倍。

      以下C++代码简答的解释了上述新图像的生成过程:

       当Beta = 0.5,M = 2时(注意到上述曲线),下述图像清晰的表达了这个扩展的过程:

         原始的图像序列只有4幅图,扩展后的为8幅图,而且我们注意到扩展后的图和源图没有一个是相同的,通过组合这新生产的8幅图,最终得到扩展的融合结果。

      就以上述图为例,Beta设置为0.5,我们金字塔层数都设置为8,Exposure Fusion和Extended Exposure Fusion的融合效果分别如下所示:

       

              Exposure Fusion                              Extended Exposure Fusion

      我们注意观察图中最左侧窗户上部的小方格内,左图里该方格里基本是纯白色,看不到什么信息,而右图则把原始图input 1里的有效信息带入了,增加了信息量。

      在比如下图,左图是标准的Exposure Fusion,右图为扩展后的,可以看到右侧图台灯里以及窗户外面的地面有着更为细腻的细节,而左图基本是纯色。

      

      在《Extended Exposure Fusion》还提到了对各图像权重的一个改进,虽然那个东西有一定作用,但是个人认为是锦上添花的一些东西吧,实际上也没有啥大的作用,因此,本人未做具体的研究。

      另外,Extended Exposure Fusion里还提到了一个叫Robust Normalization的东西,这个确实还是有点用的,他是对曝光融合的图像简单的做了一下增强,我们确实也发现普通的融合后图像不是很鲜艳,而使用Robust Normalization则可以比较为明显的改善他,这个过程有点类似于Photoshop的自动色阶或自动对比度,但是有别于他们的是他不是对单通道进行统计直方图,而是低裁剪值所依赖的直方图由每个像素的最小分量(Min(R/G/B))决定,高裁剪值所依赖的直方图由每个像素的最大分量决定。

      其他的这篇文章也没有啥好东西了。 

      二、Simulated Exposure Fusion

      那么这篇文章的作者和Extended Exposure Fusion其实是一个人,所以他们文章的思路其实是想通的。只不过这篇文章是这对单幅图像进行的处理。

      那么很明显,如果要想借用多曝光融合算法来增强单幅图像,一个很自然的想法就是在原图的基础上使用不同曝光值进行映射(增强或降低对比度),然后融合就可以了,但是这里就涉及到了几个问题,第一,如果确定需要的曝光的图像的数量,二是如何确定每幅图像的曝光值。

      我们先来看看第二个问题,假定我们已经确定了需要曝光的图像的数量为M,那么首先这样:

      我们计算出整幅图像的中间值Median,这个计算很明显可以用直方图搞定,至于彩色图像,可以直接把R/G/B所有通道的直方图全部累加后即可。一般来说,这个中间值很好的反应了整幅的明暗程度,因此,用他作为一个参考数据。利用下式计算出需要降低对比度(under-exposed image):

              Ns = int((M - 1) * Median / 255.

      则需要增加对比度的图像数量为 N =  M - 1 - Ns。

      比如Median的结果为50,则说明图像整体比较暗,如果M=10,则Ns = 1, N = 8;

      给定一个用户输入的最大对比度参数Alpha,该参数的意义上容许图像最多的增强或降低的对比度是Alpha(可过曝或欠曝),可如果在这M个序列的图像里,要能达到整个Alpah值,必须有某个参数和N或Ns有关,明显要取他们的最大值 Nx = Max(N, Ns)。论文里作者折腾了半天提出了下面这个计算式:      

                                             

     

      这个公式其实是个线性的公式,即图像整体变量或整体变暗,如果直接把这样生成的M幅图像合成,不用想,没有什么意义的。
      那么我们考虑到Extended Exposure Fusion文章里的动态范围压缩,如果把他们两个结合起来,那么是不是能获得更好的结果呢。

      因为在前面调节曝光度的时候,我们的调节公式必然会造成部分像素过曝或欠曝,如果简单的把他们裁剪掉,就造成了信息的丢失,所以我们暂时不裁剪,而是直接使用扩展的曝光融合里的动态范围压缩技术,把他们压缩,压缩完成后再次进行裁剪,这样就可以很好的控制结果了。

      这样这个过程就涉及到了前面所说的参数Beta了,那么由Alpha和Beta实际上又可以共同确定前面所说的第一个参数M,因为我们只要取某一个M使得所有的动态范围都至少又一次得到了增强。这个论文里提出了一个do while不断的去测试合理的M值:

    复制代码
     %%% Compute optimal number of images (smallest N that ensure every part of
        %%% the input range is enhanced)
        Mp = 1;              % Mp = M-1; M is the total number of images
        Ns = floor(Mp*cval); % number of images generated with fs
        N  = Mp-Ns;          % number of images generated with f
        Nx = max(N,Ns);      % used to compute maximal factor
        tmax1  = (+1    + (Ns+1)*(beta-1)/Mp)/(alpha^(1/Nx));     % t_max k=+1
        tmin1s = (-beta + (Ns-1)*(beta-1)/Mp)/(alpha^(1/Nx)) + 1; % t_min k=-1
        tmax0  = 1      + Ns*(beta-1)/Mp;                         % t_max k=0
        tmin0  = 1-beta + Ns*(beta-1)/Mp;                         % t_min k=0
        while tmax1 < tmin0 || tmax0 < tmin1s
            %%% add an image to the sequence
            Mp = Mp+1;
            %%% update values
            Ns = floor(Mp*cval);
            N  = Mp-Ns;
            Nx = max(N,Ns);
            tmax1  = (+1    + (Ns+1)*(beta-1)/Mp)/(alpha^(1/Nx));     % t_max k=+1
            tmin1s = (-beta + (Ns-1)*(beta-1)/Mp)/(alpha^(1/Nx)) + 1; % t_min k=-1
            tmax0  = 1      + Ns*(beta-1)/Mp;                         % t_max k=0
            tmin0  = 1-beta + Ns*(beta-1)/Mp;                         % t_min k=0
            if Mp > 49 % break if no solution
                warning(['The estimation of the number of image required in '...
                         'the sequence stopped because it reached M>50. ' ...
                         'Check the parameters.']);
                break
            end
        end
    复制代码

      根据不同的Alpha和Beta,已经不同的图像特性(决定了中值),可以得到不同的映射曲线,如下所示:

       注意上面的m就是指归一化的中值。

      有了这些曲线,在原有图像的基础上进行映射得到一个序列的图像,然后再用Exposure Fusion就可以了。

      论文里还提到了用HSV颜色空间的V分量来做这些工作,而不是用RGB颜色空间,这个时候由于是V是个灰度的信息,因此,在权重的计算时,饱和度那个指标就么有意义了,这个转换我觉得除了能加快下程度的速度,其他的可能并没有什么特殊的需要,而且HSV颜色空间和RGB之间的转换还是很耗时的,如果写的不好,可能还会降低速度,还不如直接在RGB颜色空间中做。

      我们测试一些图像,这个算法获得的结果却是还是相当不错和稳定的: 

      

      

       

       

      和其他的一些增强算法相比,这个方法的比较明显的特征是不会过分的引入瑕疵(比如突出的斑点或者块状),但是耗时方面也还是比较可观(和图像的内容和参数有关)。

      在原始的论文中,作者还进行了大量的比较,有兴趣的可以去看看。

           提供一个测试DEMO供有兴趣的朋友玩玩:https://files.cnblogs.com/files/Imageshop/Exposure_Fusion.rar?t=1694501148&download=true

           如果我们选择的是一个图像,则调用的即为Simulated Exposure Fusion算法。

       

           补充: 在上一篇Exposure fusion里,也简单的提到了不做权重融合,只对拉普拉斯金字塔取最大值、平均值等操作的多图融合方式,虽然这种融合对于多曝光融合的效果很一般,但是在对于多焦段融合时确有着较为明显的优势,这个时候权重融合反而效果很差,如下图所示 :

       

                    原图1                                  原图2                                   

       

              基于特征权重的融合                            基于最大值/平均值的融合

      其实想一想,道理也很简单,多焦距的图像,在非焦点区域,图像是模糊的,焦点区域图像是清晰的,因为模糊区域的拉普拉斯金字塔必然数较小,而焦点区域因为有很多图像细节,拉普拉斯数据丰富,因此,如果是用特征权重融合,模糊区域对结果就一定有影响,而如果用最大值,则只取那些清晰的区域,所以合成后的结果就更为清晰。

      所以说,不同的算法还是有不同的应用场景,必须找到合适的对象予以体现他们的价值。

      如果想时刻关注本人的最新文章,也可关注公众号或者添加本人微信:  laviewpbt

                                 

  • 相关阅读:
    Ubuntu22.10安装Docker运行SRS流媒体服务
    数据结构与算法完整版 | 超详细图解,看这一篇就够了
    java算法学习索引之二叉树问题
    【Java 基础篇】Java 中的 `wait` 与 `notify` 方法详解
    MySQL基础-多表查询
    线性代数笔记8--AX=b:可解性、解的结构
    声纹技术(六):声纹技术的其他应用
    ANR问题分析定位
    Docker命令
    Go构建模式:GOPATH、vendor、Go Module
  • 原文地址:https://www.cnblogs.com/Imageshop/p/17706628.html