一种基于视神经网络的高动态范围(HDR)图像自适应局部色调映射的实现

参考:一种基于视神经网络的高动态范围(HDR)图像自适应局部色调映射的实现【OpenCV】【CUDA】_51CTO博客_hdr高动态范围成像

INTRODUCTION

我们提出了一种新的基于retinex理论的高动态范围图像色调映射技术。我们的算法包括两个步骤,即人类视觉系统的全局自适应和局部自适应。在局部自适应过程中,用引导滤波器代替retinex算法的高斯滤波器以减少光晕伪影。为了保证良好的再现和动态范围压缩,我们提出了一种基于场景亮度值的对比度增强因子。此外,还引入了一种自适应非线性偏移来处理对数函数的非线性强度。实验表明,我们的算法在保留细节和减少光晕伪影的同时,提供了令人满意的结果

现实世界场景的动态范围非常大,从阴影到高光有四个顺序[1]。由于其适应机制,人类视觉系统能够应对真实场景。然而,照片与真实场景不同,例如白天的室外场景,其动态范围很大。传统相机或数码相机由于其不完善性,无法捕捉场景的动态范围[2]。尽管可以从不同曝光的照片中获得包含真实场景的全动态范围的高动态范围(HDR)图像[3],但诸如普通监视器之类的低动态范围(LDR)显示设备不能处理场景的全动力学范围。这些设备只能显示两个数量级[1]、[4]。一旦HDR图像被线性映射到显示设备,许多信息就会丢失。因此,HDR图像在被映射到设备之前必须被压缩。从HDR图像到LDR显示设备的映射技术被称为色调映射或色调再现,这与我们的工作有关

将这些技术分为两类:第一类是全局算子,另一类是局部算子[2]。全局色调映射操作符将单个函数应用于所有像素。Drago等人[5]提出了使用自适应对数基数对场景亮度值进行对数压缩。在最暗的区域,他们使用2作为对数底,而他们使用10作为对数底来压缩最高区域的对比度。后来,Cvetković等人[6]介绍了一种基于样条的改进色调映射函数,该函数增强了暗区域的可见性,同时保持了亮区域的可见性。此外,他们将算法与多次曝光技术相结合,以提高黑暗区域的信噪比。这些全局方法通常需要较低的计算复杂度,但不能保留场景的细节。

局部色调映射算子基于每个像素的邻域像素将不同的函数应用于每个像素。Reinhard等人([1])开发了一种新的色调映射算子,使用了称为区域系统的摄影经验。他们引入了一种自动闪光和烧制技术,以避免细节丢失。Durand和Dorsey([7])引入了一种快速双边滤波器,将图像分解为基础层和细节层。他们降低了基础层的对比度,同时保留了细节层。Fattal等人[8]提出了一种基于梯度的新方法。他们使用梯度衰减函数衰减对数域中大梯度的幅度。在求解泊松方程之后,获得色调映射图像。后来Meylan和Susstrunk[4]提出了一种基于retinex的HDR图像渲染方法。他们引入了自适应滤波器和sigmoid函数来解决基于环绕的retinex的缺点。这些局部方法通常比全局方法性能更好,但也有几个缺点。一个是局部方法比全局方法更复杂。另一种是光晕伪影是由于利用邻域像素而产生的。因此,在设计色调映射算子时,除了保留视觉内容和原始场景的整体外观外,还必须考虑减少光晕伪影。特别是,对于视频监控系统来说,保存场景中的大量信息是非常重要的。

在本文中,我们提出了一种新的基于中心/环绕视网膜的局部色调映射方法[9-11],该方法可以保留细节并防止光晕伪影。本文的组织结构如下。第2节回顾了作为我们工作基础的中心/周围视网膜。我们研究了中心/周围视网膜的特征并描述了其缺点。我们的新色调映射算子在第3节中提出,第4节提供了实验结果。最后,第5节总结了我们的工作

CENTER/SURROUND RETINEX

retinex理论最初由Land定义[12]。它解释了人类视觉系统如何从世界中提取可靠的颜色信息[4]。基于中心/环绕视网膜[9],Jobson等人介绍了单尺度视网膜(SSR)[10]和多尺度视网膜(MSR)[11]。在本文中,这些被称为retinex算法。SSR由给出

其中 c 是高斯环绕空间常数。K 是归一化因子(一个小的空间常数会产生良好的动态范围压缩,但颜色再现却比较糟糕。相反,一个大的常数能产生良好的颜色再现,但动态范围压缩却不太好)

 其中 N 是尺度的数量,   表示第 n 个尺度的第 i 个组成部分, 是 MSR 输出的第 i 个光谱分量, 是与第 n  个尺度相关的权重。 

MSR 的目标是减少高对比度边缘周围的晕圈伪影,并与动态范围压缩和颜色再现保持平衡。MSR 产生了良好的动态范围压缩,但仍然遭受光晕伪影的影响。此外,小空间常数的 SSR 使图像中较大的均匀区域变灰变平

PROPOSED TONE MAPPING BASED ON RETINEX

在第2节中,我们描述了retinex算法的特点和缺点。通过引入一种新方法克服了这些缺点。在我们的算法中,从输入HDR图像中获得亮度值并进行处理。首先,我们应用全局色调映射作为预处理。然后,基于retinex算法应用局部色调映射。最后,在归一化之后,从处理后的亮度值和输入色度值获得输出图像

Global Adaptation

全球适应就像人类视觉系统的早期阶段一样发生[4]。根据Weber-Fechner定律[5],人类视觉系统将亮度感知为近似对数函数。为了全局压缩HDR场景的动态范围,我们在[5]中的(4)中使用以下函数

其中N是图像中的像素总数,δ是小值,以避免图像中存在黑色像素时出现的奇异性。

输入的世界亮度值和最大亮度值除以场景的对数平均亮度。这使得(4)能够适应每个场景。当对数平均亮度收敛到高值时,函数从对数函数的形状收敛到线性函数。因此,低对数平均亮度的场景比具有高值的场景得到更多的提升。结果,根据场景的对数平均亮度充分地压缩了整个场景亮度值

Local Adaptation

基于retinex理论的局部适应是在全局适应过程之后应用的。在(1)中,位于更亮的像素值附近的输入的输出变得非常暗,并且这导致光晕伪影,其使得结果看起来不自然。可以通过引入边缘保持滤波器来减少伪影。我们用引导滤波器[13]代替retinex算法的高斯滤波器。引导滤波器是像双边滤波器[14]一样的边缘保持滤波器,其权重不仅取决于欧几里得距离,还取决于亮度差。这些滤波器的行为相似,但引导滤波器在边缘附近具有更好的性能[13]。此外,它的计算复杂度是没有近似的线性时间,与核大小无关[13]。局部自适应方程可以写成

在应用滤波器之后,光晕伪影显著减少,但是由于其低的全局对比度,输出给出了不令人满意的整体外观。由于边缘保持滤波器的特性,滤波器将非常低的权重分配给在其亮度值和中心像素的值之间具有大差异的邻域像素。结果,(6)的Lg(x,y)和Hg(x,y)值趋于相似,这在局部自适应输出的像素之间没有大的差异。(6)的结果给出了看起来平坦的外观,并且失去了输入图像的原始亮度分布。这一分析使我们引入了新的方法。

 为了防止滤波器引起的外观平坦,并提高我们的方法的性能,我们引入了两个重要因素。第一,对比度增强因子由下式给出

其中η表示对比度控制参数,Lg max是全局自适应输出的最大亮度值。

另一方面,根据场景内容而变化的自适应非线性偏移可以写成

其中λ是非线性控制参数,是全局自适应输出的对数平均亮度。

通过将这些因素整合到(6)中,最终的局部适应方程如下所示:

我们引入对比度增强因子α(x,y)来获得令人满意的渲染图像的整体外观。如上所述,使用引导式过滤器会导致平面外观。全局自适应输出Lg(x,y)控制每个像素的对比度增强因子。原本暗的像素使对比度增强因子低,而亮的像素使该因子高。因此,通过考虑全局压缩场景的亮度值,局部自适应输出比以前具有更自然的外观。

为了根据场景控制对数函数的非线性,我们提出了自适应非线性偏移β。对数函数是一个梯度逐渐减小的非线性函数。全局自适应输出的对数平均亮度通过改变(13)中对数的起始点来控制非线性的强度。全局自适应输出的低对数平均亮度使得对数函数从大的梯度开始。然后,对数曲线比高对数平均亮度情况更能增加总亮度值。这确保了基于场景内容的局部自适应输出的正确映射。

在局部自适应之后,将处理后的亮度值从0重新缩放到1。最后,从局部自适应输出和输入HDR图像的亮度值获得色调映射图像。

EXPERIMENTAL RESULTS

在我们的实验中测试了各种HDR图像,使用了以下亮度值:L=0.299R 0.587G 0.114B。我们实验使用的参数如表Ⅰ所示,默认参数适用于各种HDR图片。引导滤波器的半径r和正则化参数ε的值与减少光晕伪影和保持局部对比度保持平衡,非线性控制参数λ的值确保了对场景内容的适当考虑,对比度控制参数η的值提供了适当的整体对比度。随着λ和η变大,输出的整体亮度值变暗,输出的全局对比度分别增加。

与自适应对数方法[5]、摄影方法[1]、基于Retinex的自适应方法[4]和所提出的方法进行比较如图3和图4所示。所有方法都使用默认参数进行测试。由于很难评估这些方法的客观性能,我们选择心理物理实验来评估结果。前三种方法不能很好地保留明亮区域的细节,但我们的方法不仅保留了大量的视觉内容,而且显示出良好的整体外观,这比其他方法有竞争力或更好。图4中的放大图像显示,我们的方法显示了所有可用方法中最清晰的细节。此外,我们的方法的另一个优点是,用户可以根据其应用来控制全局对比度。不包括引导滤波过程,我们的方法在2.40 GHz Core 2 Quad上使用未优化代码对512*768像素进行26ms处理。[13]中报告了比双边滤波更快的引导滤波的运行时间。

CONCLUSIONS

随着HDR图像的日益使用,色调映射技术得到了广泛的研究。我们提出了一种基于retinex理论的局部色调映射算法来处理HDR图像。我们不使用retinex算法的高斯滤波器,而是采用引导滤波器来减少光晕伪影。我们发现,引导滤波器没有充分利用邻域像素,这导致了平坦的外观。为了防止这种缺点,我们引入了对比度增强因子。此外,我们通过添加自适应非线性偏移来处理对数函数的非线性。有了这些因素,我们同时实现了良好的动态范围压缩和良好的整体外观。实验结果表明,我们的方法产生了令人满意的HDR图像渲染,并且保留了许多细节,这将有利于未来的视频监控系统和消费者数码相机。

官方源码;

function outval = ALTM_Retinex(I)
II = im2double(I);
Ir=double(II(:,:,1)); Ig=double(II(:,:,2)); Ib=double(II(:,:,3));
% Global Adaptation
Lw = 0.299 * Ir + 0.587 * Ig + 0.114 * Ib;% input world luminance values
Lwmax = max(max(Lw));% the maximum luminance value
[m, n] = size(Lw);
Lwaver = exp(sum(sum(log(0.001 + Lw))) / (m * n));% log-average luminance
Lg = log(Lw / Lwaver + 1) / log(Lwmax / Lwaver + 1);
gain = Lg ./ Lw;
gain(find(Lw == 0)) = 0;
outval = cat(3, gain .* Ir, gain .* Ig, gain .* Ib);
figure;
imshow(outval)
function outval = ALTM_Retinex(I)
II = im2double(I);
Ir=double(II(:,:,1)); Ig=double(II(:,:,2)); Ib=double(II(:,:,3));
% Global Adaptation
Lw = 0.299 * Ir + 0.587 * Ig + 0.114 * Ib;% input world luminance values
Lwmax = max(max(Lw));% the maximum luminance value
[m, n] = size(Lw);
Lwaver = exp(sum(sum(log(0.001 + Lw))) / (m * n));% log-average luminance
Lg = log(Lw / Lwaver + 1) / log(Lwmax / Lwaver + 1);
% Local Adaptation
kenlRatio = 0.01;
krnlsz = floor(max([3, m * kenlRatio, n * kenlRatio]));
Lg1 = maxfilt2(Lg, [krnlsz, krnlsz]);
Lg1 = imresize(Lg1, [m, n]);
Hg = guidedfilter(Lg, Lg1, 10, 0.01);
eta = 36;
alpha = 1 + eta * Lg / max(max(Lg));
alpha = alpha .* (alpha .^ (1 ./ alpha));
b = max(max(alpha));
a = 1.35;
alpha = 2 * atan(a * alpha / b) / pi * b;
Lgaver = exp(sum(sum(log(0.001 + Lg))) / (m * n));
lambda = 10;
beta = lambda * Lgaver;
Lout = alpha .* log(Lg ./ Hg + beta);
%Lout = normfun(Lout, 1);
Lout = SimplestColorBalance(Lout, 0.005, 0.001, 1);
gain = Lout ./ Lw;
gain(find(Lw == 0)) = 0;
outval = cat(3, gain .* Ir, gain .* Ig, gain .* Ib);
%outval(find(outval > 1)) = 1;
%outval = SimplestColorBalance(outval, 0.001, 0.02, 1);
%[H, S, V] = rgb2hsv(outval);
%V = adapthisteq(V, 'NumTiles', [4, 4], 'ClipLimit', 0.0025, 'NBins', 256, ...
%    'Range', 'full', 'Distribution', 'exponential', 'Alpha', 0.4);
%outval = hsv2rgb(cat(3, H, S, V));

最近更新

  1. TCP协议是安全的吗?

    2024-01-11 05:46:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-11 05:46:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-11 05:46:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-11 05:46:02       18 阅读

热门阅读

  1. 网络基础面试题(四)

    2024-01-11 05:46:02       26 阅读
  2. 【leetcode100-033】【链表】排序链表

    2024-01-11 05:46:02       39 阅读
  3. C/C++指针、数组和结构体浅析

    2024-01-11 05:46:02       43 阅读
  4. 8大基本类型的转换和运算符

    2024-01-11 05:46:02       33 阅读
  5. 7593 蜘蛛、蜻蜓与蝉(2)

    2024-01-11 05:46:02       25 阅读