《ISP学习笔记——DRC算法》

目录

DRC概要

算法分类

线性移位算法

对数映射算法

分段函数映射算法

自适应性对数映射算法

自适应性对数映射算法

技术概念

小结

相关学习链接:


DRC概要

DRC(Dynamic Range Compression)是一种重要的图像处理技术,旨在调整图像的动态范围,使其适应不同的显示设备并在视觉上更加平衡和自然。

DRC技术的目标是将高动态范围(HDR)图像转换为适合低动态范围(LDR)显示设备的范围,以避免细节的丢失并提供更好的视觉效果。HDR图像可以捕捉广泛的亮度范围,但是常见的显示设备(如普通显示屏)并不具备显示如此广泛范围的能力。在某些情况下,图像可能具有较大的动态范围,但显示设备(如显示屏或打印机)可能无法准确地呈现这么大的范围。这就可能导致部分细节在显示过程中丢失。因此,DRC技术通过重新映射图像的亮度级别来确保图像在LDR设备上呈现出适当的亮度变化,以及充分的细节保留。

人眼的亮暗适应范围大约可以达到 20 倍到 24 倍,或者以分贝(dB)来衡量,大约是 130 dB 到 140 dB 范围内

  • 8bit图像:256级,约为48dB(约为20 * log10(256))
  • 10bit图像:1024级,约为60dB
  • 12bit图像:4096级,约为72dB
  • 16bit图像:65536级,约为96dB
  • 24bit图像:16777216级,约为144dB

算法分类

《ISP学习笔记——DRC算法》_第1张图片

 

全局映射和局部映射是两种常见的DRC算法类型:

  1. 全局映射(Global Mapping): 全局映射算法将整个图像的亮度范围进行压缩,通常使用简单的函数(如线性移位或对数映射)来调整亮度值。这种方法的优点在于实现简单,但可能会导致图像细节的损失,因为不同区域的亮度变化可能被压缩成一个较小的范围。

  2. 局部映射(Local Mapping): 局部映射算法考虑像素与像素之间的关系,根据局部特征来调整亮度值。这种方法可以更好地保留图像的细节,但算法的复杂性相对较高,因为它需要分析像素之间的关系。

表1:算法综述分类

《ISP学习笔记——DRC算法》_第2张图片

在这些算法中,有一些常见的方法:

  • 线性移位算法: 简单且易于实现,通过右移HDR图像的比特位数来进行压缩,但可能导致颜色分辨率降低,细节丢失,以及失真现象。

  • 对数映射算法: 使用对数函数将HDR图像映射到LDR范围,但它通常是全局的,可能无法保留图像的局部细节。

  • 分段函数映射算法: 将HDR图像分为不同的亮度区间,对每个区间应用不同的映射函数,以保留细节并增强图像的对比度。

  • 自适应性对数映射算法: 考虑到实际场景的亮度分布,通过引入适应性参数来调整对数映射,以实现更好的动态范围压缩效果。

  • 高动态范围图像可视化算法: 结合全局和局部映射方法,通过双向滤波器将图像分解为基本层和细节层,并分别应用不同的映射方法,以提高视觉效果。

线性移位算法

工作原理:
        线性移位算法通过对HDR图像的像素值进行右移操作来进行压缩。具体来说,它将每个像素值向右移动一定的位数,以适应LDR显示的范围。这个移动的位数取决于HDR图像的位深度和LDR显示设备的位深度之间的差异。

例如,如果HDR图像使用10位深度表示,而LDR显示设备使用8位深度表示,那么每个像素值可以向右移动2个位来进行压缩。这会导致HDR图像的亮度范围被缩小,适应于LDR显示。

优点:

  1. 简单易实现: 线性移位算法非常简单,只需要对图像的像素值进行位移操作,因此实现起来相对容易。

  2. 快速处理: 由于算法的简单性,线性移位算法的处理速度较快,适用于实时应用。

  3. 保留全局信息: 虽然压缩了图像的动态范围,但线性移位算法仍然可以在一定程度上保留图像的全局信息。

缺点:

  1. 细节损失: 由于线性移位算法是全局性的压缩,它可能会导致图像的细节损失。特别是在亮度较高的区域,细节可能会被压缩到一个较小的范围内,导致失真。
  2. 对比度降低: 线性移位算法会降低图像的对比度,使得图像的整体动态范围变小。

  3. 不适用于复杂场景: 对于具有复杂光照和颜色变化的场景,线性移位算法可能无法提供满意的效果,因为它无法根据像素之间的关系进行局部调整。

% 读取HDR图像
hdrImage = imread('input_hdr_image.png'); % 替换为你的HDR图像文件路径

% 指定HDR图像的位深度和LDR显示设备的位深度
hdrBitDepth = 10; % HDR图像的位深度
ldrBitDepth = 8;  % LDR显示设备的位深度

% 计算位移量
shiftAmount = hdrBitDepth - ldrBitDepth;

% 对HDR图像进行线性移位算法压缩
compressedImage = bitshift(hdrImage, -shiftAmount);

% 显示原始HDR图像和压缩后的图像
subplot(1, 2, 1);
imshow(hdrImage);
title('原始HDR图像');

subplot(1, 2, 2);
imshow(compressedImage);
title('线性移位压缩后的图像');

% 保存压缩后的图像
imwrite(compressedImage, 'compressed_image.png'); % 替换为你想保存的文件路径

对数映射算法

        动态范围压缩算法中的对数映射算法,又称为对数压缩算法,旨在将高动态范围图像(HDR)映射到适合低动态范围(LDR)显示的范围内。

工作原理:
对数映射算法基于对数函数,它将HDR图像中的像素值进行对数变换,以降低高亮度区域的差异并提高低亮度区域的细节。具体步骤如下:

  1. 对HDR图像中的每个像素值进行对数变换。设HDR图像中的像素值为x,对数映射公式为:f(x) = a * log2(x + 1),其中a是缩放因子,log2是以2为底的对数函数。

  2. 然后将映射后的值进行线性变换,以将值映射到适合LDR显示的范围内(通常是0到255)。这可以通过线性缩放公式实现:mapped_value = (f(x) / max_mapped_value) * 255。

优点:

  1. 简单易实现: 对数映射算法相对于其他复杂的局部映射算法来说是比较简单的。

  2. 提高低亮度区域细节: 对数映射算法能够将高动态范围图像的细节映射到较低的亮度区域,使得暗部细节更加清晰可见。

  3. 计算效率较高: 相对于一些复杂的局部映射算法,对数映射算法的计算效率较高,适用于实时应用。

缺点:

  1. 全局性: 对数映射算法是一种全局算法,可能无法充分考虑图像的局部特征,因此在某些情况下,可能无法达到理想的效果。

  2. 对比度问题: 对数映射算法在进行对数变换后,可能会导致图像的高亮度区域的对比度降低,因为较大的像素值在对数变换后被拉伸。

  3. 失真问题: 对数映射算法可能会在图像的高亮度区域引入一些失真,因为对数变换会将高亮度像素值映射到较小的范围。

综合来看,对数映射算法是一种相对简单但效果一般的动态范围压缩方法。它适用于一些不太复杂的场景,但对于需要更好的细节保留和局部调整的情况,可能需要考虑其他更复杂的压缩算法。

% 读取HDR图像
%假设输入图像是灰度图像,如果你处理的是彩色图像,需要分别对每个通道进行对数映射
hdrImage = imread('input_hdr_image.png'); % 替换为你的HDR图像文件路径

% 指定对数映射的基数和缩放因子
logBase = 2;    % 对数映射的基数
scalingFactor = 255 / (log2(max(hdrImage(:)) + 1)); % 缩放因子

% 对HDR图像进行对数映射
logMappedImage = scalingFactor * log2(double(hdrImage) + 1);

% 将对数映射后的图像值映射到[0, 255]范围
logMappedImage = uint8(logMappedImage);

% 显示原始HDR图像和对数映射后的图像
subplot(1, 2, 1);
imshow(hdrImage);
title('原始HDR图像');

subplot(1, 2, 2);
imshow(logMappedImage);
title('对数映射后的图像');

% 保存对数映射后的图像
imwrite(logMappedImage, 'log_mapped_image.png'); % 替换为你想保存的文件路径

分段函数映射算法

        分段函数映射算法是一种动态范围压缩算法,旨在通过将高动态范围图像(HDR)分为不同的亮度区域,然后对每个区域应用不同的映射函数来实现动态范围的压缩。以下是关于这种算法的详细介绍:

工作原理:
分段函数映射算法将HDR图像分为低亮度区域、中间亮度区域和高亮度区域,然后为每个区域分别定义一个映射函数。这些映射函数通常是线性函数,其斜率在不同区域之间有所不同。这样可以提高图像的对比度,同时在不同亮度区域中保留细节。

优点:

  1. 局部适应性: 分段函数映射算法可以根据图像的局部特征进行调整,因此能够更好地保留图像的细节。

  2. 提高中间值分辨率: 通过增加中间亮度区域的斜率,分段函数映射算法有意地提高了中间值像素的分辨率,使图像在这个区域内的变化更加明显。

  3. 考虑图像的局部特征: 算法考虑了图像的局部特征变化,因此可以更好地适应不同图像的情况。

缺点:

  1. 粗粒度的调整: 尽管分段函数映射算法可以根据不同的亮度区域进行分辨率调整,但由于每个区域仍然使用线性函数进行映射,因此在一些情况下可能会产生粗粒度的效果。

  2. 像素关系: 该算法在区域之间仍然是全局的,没有考虑像素之间的关系,可能会导致在一些区域中出现失真或不连续性。

综合来看,分段函数映射算法在一定程度上能够改善图像的动态范围,但也存在一些限制。对于一些场景和图像,可能需要更复杂的算法来实现更好的动态范围压缩效果。

% 读取HDR图像
hdrImage = imread('input_hdr_image.png'); % 替换为你的HDR图像文件路径

% 指定分段映射的参数
breakpoint1 = 100; % 第一个拐点
breakpoint2 = 200; % 第二个拐点
slope1 = 0.5;      % 第一个区域的斜率
slope2 = 2;        % 第二个区域的斜率
slope3 = 0.3;      % 第三个区域的斜率

% 对HDR图像进行分段函数映射
ldrImage = zeros(size(hdrImage));
for i = 1:size(hdrImage, 1)
    for j = 1:size(hdrImage, 2)
        if hdrImage(i, j) <= breakpoint1
            ldrImage(i, j) = slope1 * hdrImage(i, j);
        elseif hdrImage(i, j) <= breakpoint2
            ldrImage(i, j) = slope1 * breakpoint1 + slope2 * (hdrImage(i, j) - breakpoint1);
        else
            ldrImage(i, j) = slope1 * breakpoint1 + slope2 * (breakpoint2 - breakpoint1) + slope3 * (hdrImage(i, j) - breakpoint2);
        end
    end
end

% 将映射后的图像值映射到[0, 255]范围
ldrImage = uint8(ldrImage);

% 显示原始HDR图像和分段函数映射后的图像
subplot(1, 2, 1);
imshow(hdrImage);
title('原始HDR图像');

subplot(1, 2, 2);
imshow(ldrImage);
title('分段函数映射后的图像');

% 保存分段函数映射后的图像
imwrite(ldrImage, 'segment_mapped_image.png'); % 替换为你想保存的文件路径

自适应性对数映射算法

自适应性对数映射算法是一种动态范围压缩算法,旨在通过引入实际场景的最高亮度值和目标LDR显示设备的最高亮度值的对数比,结合一个优化的对比度调节因子,将HDR图像映射到LDR范围内。以下是对该算法的详细介绍:

工作原理:
自适应性对数映射算法首先确定实际场景中的最高亮度值和LDR显示设备的最高亮度值。然后,通过计算它们的对数比,得到一个比例因子。这个比例因子可以用来扩大中间亮度值的映射范围,同时压缩高亮度值的映射斜率。这样可以在LDR图像中更好地保留细节,同时提高图像的整体对比度。

优点:

  1. 适应性调节: 自适应性对数映射算法根据实际场景的亮度范围来调整映射,因此能够更好地适应不同的图像和场景。

  2. 增强中间亮度: 通过扩大中间亮度值的映射范围,可以提高图像的整体对比度,从而使中间亮度值更加明显。

  3. 保留细节: 通过压缩高亮度值的映射斜率,可以在LDR图像中更好地保留高亮度区域的细节,避免了高光区域过曝。

缺点:

  1. 复杂度: 自适应性对数映射算法可能需要更多的计算,包括确定最高亮度值的对数比和选择合适的对比度调节因子,从而可能会增加计算复杂度。

  2. 参数选择: 确定合适的对比度调节因子可能需要一些试错,不同图像和场景可能需要不同的参数设置。

综合来看,自适应性对数映射算法在一定程度上能够提高图像的动态范围压缩效果,尤其适用于需要在LDR图像中保留更多细节的情况。然而,算法的复杂度和参数选择可能需要一些额外的注意。

% 读取HDR图像
hdrImage = imread('input_hdr_image.png'); % 替换为你的HDR图像文件路径

% 获取实际场景最高亮度值和LDR显示设备最高亮度值
maxLuminanceScene = max(hdrImage(:)); % 实际场景最高亮度值
maxLuminanceLDR = 255; % LDR显示设备最高亮度值

% 计算对数比和对比度调节因子
logRatio = log(maxLuminanceLDR) / log(maxLuminanceScene);
contrastFactor = 1.5; % 根据需要调整对比度调节因子

% 对HDR图像进行自适应性对数映射
ldrImage = contrastFactor * (log(double(hdrImage) + 1) * logRatio);

% 将映射后的图像值映射到[0, 255]范围
ldrImage = uint8(ldrImage);

% 显示原始HDR图像和自适应性对数映射后的图像
subplot(1, 2, 1);
imshow(hdrImage);
title('原始HDR图像');

subplot(1, 2, 2);
imshow(ldrImage);
title('自适应性对数映射后的图像');

% 保存自适应性对数映射后的图像
imwrite(ldrImage, 'adaptive_log_mapped_image.png'); % 替换为你想保存的文件路径

自适应性对数映射算法

        高动态范围图像可视化算法是一种综合了全局和局部映射策略的动态范围压缩算法,旨在保留图像的全局对比信息的同时增强局部细节,从而提供更好的视觉效果。以下是对该算法的详细介绍:

工作原理:

  1. 对数域分解: 首先,使用快速双向滤波器对输入的高动态范围图像进行对数域分解。这会将图像分成基本层和细节层,其中基本层包含全局信息,而细节层包含局部细节。

  2. 全局映射: 对基本层进行全局映射算法,通常是直方图映射或者其他类似的调整,以保留全局对比度信息。

  3. 局部映射: 对细节层进行自适应性细节增强,通常是利用局部对比度和梯度信息,增强图像的局部细节。

  4. 合成: 将经过全局和局部映射的基本层和细节层合成为最终的压缩图像。这样可以保留全局对比信息的同时增强局部细节。

优点:

  1. 全局对比度保留: 通过全局映射策略,算法能够保留图像的全局对比度信息,使得图像整体更具视觉效果。

  2. 局部细节增强: 通过局部映射策略,算法能够增强图像的局部细节,使得图像在高亮度和暗部区域都能保留更多细节。

  3. 视觉效果优良: 由于综合了全局和局部映射策略,该算法通常能够提供更好的视觉效果,使图像更接近真实场景。

缺点:

  1. 复杂度较高: 引入了双向滤波器和局部映射策略,使得算法的计算复杂度较高,可能需要更多的计算资源。

  2. 参数调整: 由于涉及到多个阶段的映射和处理,算法可能需要对多个参数进行调整,以获得最佳的视觉效果。

综合来看,高动态范围图像可视化算法通过综合全局和局部映射策略,能够在保留全局对比度的基础上增强局部细节,提供更好的视觉效果。然而,由于算法的复杂度较高,可能需要在性能和效果之间进行权衡。

% 读取HDR图像
hdrImage = imread('input_hdr_image.png'); % 替换为你的HDR图像文件路径

% 使用快速双向滤波器进行对数域分解
basicLayer = fastBilateralFilter(hdrImage); % 基本层,保留全局信息
detailLayer = hdrImage - basicLayer;       % 细节层,包含局部细节

% 全局映射(这里简化为直方图映射)
basicLayer = histeq(basicLayer);

% 局部映射(这里简化为细节增强)
detailLayer = adapthisteq(detailLayer, 'ClipLimit', 0.03);

% 合成基本层和细节层
ldrImage = basicLayer + detailLayer;

% 将映射后的图像值映射到[0, 255]范围
ldrImage = uint8(ldrImage);

% 显示原始HDR图像和高动态范围图像可视化后的图像
subplot(1, 2, 1);
imshow(hdrImage);
title('原始HDR图像');

subplot(1, 2, 2);
imshow(ldrImage);
title('高动态范围图像可视化后的图像');

% 保存高动态范围图像可视化后的图像
imwrite(ldrImage, 'hdr_visualized_image.png'); % 替换为你想保存的文件路径

技术概念

动态范围:

在数字图像处理领域,动态范围通常以亮度级别或位深度表示,而不是以分贝(dB)为单位来直接描述。分贝通常用于衡量信号的相对强度、功率或幅度的比率,适用于声音、电信号等。

尽管如此,在工程应用中,我们私下还是以db去表述。这里一些常见显示器类型的动态范围,以及一些近似的相对分贝表示(请注意,这只是一种近似方式,并不是直接的分贝表示):

  1. 普通液晶显示器(LCD):通常在 100:1 到 1000:1 的动态范围,相对分贝表示大约在 40 dB 到 60 dB。
  2. 高对比度液晶显示器:具有更高对比度的LCD显示器可以达到 1000:1 到 5000:1,相对分贝表示大约在 60 dB 到 70 dB。
  3. OLED显示器:OLED显示器能够提供更高的动态范围,通常在数千至数万的亮度级别之间,相对分贝表示可能在 80 dB 到 100 dB 以上。
  4. HDR显示器:高动态范围(HDR)显示器旨在提供更宽广的动态范围,通常能够达到数千至数万的亮度级别,相对分贝表示可能在 80 dB 到 120 dB 以上。

这些数值是近似估计,实际情况可能会因制造技术、型号和显示器质量等因素而有所不同。动态范围不是以分贝为单位来描述的,因此这些相对分贝值仅用于概述不同类型的显示器之间的大致亮度范围。

小结

        DRC算法本质上是一种压缩映射关系,对HDR后的数据进行动态范围的压缩,为了显示到显示器上,尽可能保留图像原图的细节与对比度。

相关学习链接:

https://www.cnblogs.com/linhaostudy/p/13968397.html

ISP算法简述与逻辑实现-DRC与GTM - 知乎

https://www.ebaina.com/articles/140000015206

海思平台ISP的功能介绍及相关概念的理解_海思isp 杭州_酸菜鱼的鱼的博客-CSDN博客

ISP(图像信号处理)之——图像处理概述_图像cnr_lyfwill的博客-CSDN博客

“湖光秋月两相和”——ISP核心算法介绍及其与AI技术的融合 - 中国知网 (cnki.net)

针对Hi3519DV500的ISP开发说明——AIDRC算法应用_专栏_易百纳技术社区

海思平台ISP各模块介绍

论文:

保持局部对比度的动态范围压缩算法 - 中国知网 (cnki.net)

一种图像动态范围压缩算法及其FPGA实现 - 中国知网 (cnki.net)

你可能感兴趣的:(ISP,图像处理)