红外图像动态范围压缩和对比度增强


2参考文献:

Dynamic-range compression and contrast enhancement in infrared imaging systems


对比度增强(CE)和动态范围压缩(DRC)技术

       对比度增强技术广泛应用于图像处理中,该技术可以被划分为两类:基于非锐化掩码(unsharp mask)的方法和基于直方图均衡化(histogram equalization)的方法。基于非锐化掩码的方法的思想是将图像分解为低通成分和高通成分(低频图像和高频图像,即背景图像和目标图像),然后将高通成分按照比邻加权加到原始图像中,以此来获得锐化的图像,数学模式为:

                                                

公式中,\alpha为高通成分的增强系数,fm为低通成分。

该方法存在两个主要的缺点:

其一,放大均匀区域的噪声;

其二,过度增强高频细节,导致出现伪影(光晕伪影);


       基于直方图均衡化的方法简单并且高效,是图像对比度增强的通用方法。该方法可以分为两类,一是基于全局直方图均衡化的方法;而是基于自适应的直方图均衡化方法。基于全局直方图均衡化的方法针对整张图像进行操作,方法简单,但是实验效果欠缺;基于自适应的直方图均衡化的方法采用固定的滑动窗口来计算均衡化曲线,该方法计算量大,并且在图像的边缘区域会产生强伪影。不管是基于全局直方图均衡化方法还是基于自适应直方图均衡化方法都存在缺陷。在这两种情况下,对于给定的输入灰度级,映射函数的斜率与该灰度级的直方图所设定的值成正比。这意味着,如果出现大的平坦区域,映射函数与高频的像素值对应的斜率将非常高。因此,大量的不包含细节信息的灰度级在输出灰度级中占据了大量的灰度级范围。而图像中包含重要结构信息的部分的灰度级被映射到灰度级范围更少。为了解决在映射过程中,图像的细节信息被抑制的问题,论文引入了对比度限制的自适应直方图均衡化算法(CLAHE)。该方法的思想是计算一个阈值(论文中以百分比来计算该阈值),统计直方图中所有灰度级的像素个数超出该阈值的总和,然后将超出的部分再分配这个直方图中。


动态范围压缩技术(Dynamic Range Compression)

       现代热成像相机和商用的数码相机的动态范围为12bit到16bit,需要经过动态范围压缩(DRC)才能在显示器上显示这些高动态范围的图像。其主要任务是用简单的线性压缩方法降低高亮度边缘的对比度和增强低对比度部分的可视度。增强低对比度区域的小边缘可能会产生光晕伪影。针对这个需求,现在大多数方法都是在对数域(log domain)内工作的,因为亮度的对数值(真实世界测量到的辐射度)代表了人眼感知到的亮度的近视值(人眼对场景的感知)。由此,也科研人员也提出了一系列的处理方法。

       论文提出了一种新的方法用于可视化高动态范围(HDR)的红外图像。该方法采用一种新的局部CLAHE方法来推导一种结合局部对比度增强和动态范围压缩的技术。命名为Balanced CLAHE和Contrast Enhancement(平衡的对比度限制的自适应直方图均衡化Balanced CLAHE和对比度增强BCCE技术)。

       局部对比度增强用于提升低对比度细节信息,动态范围压缩(DRC)用于有效地利用到整个输出灰度级动态范围,尤其是当存在较大像素强度变化时(如地平线的情形)。为此,论文采用基于CLAHE算法的映射函数来产生具有零斜率均衡的曲线,用于映射输入图像直方图中像素个数为0的灰度级。


算法模型如下,该模型可以分为两个部分来看,一个是高动态向低动态范围的映射函数,另一个是局部对比度增强。


代码实现

1、计算图像局部对比度图

% 计算局部对比度图CImage
meanFilterKer = fspecial('average', [5, 5]);
meanImage = imfilter(Image, meanFilterKer, 'replicate');
CImage =1.0 .* double(Image) ./double(meanImage);  

2、计算映射关系。为了简化实现,代码没有对图像进行分块处理。

function lPhist_new = balancedCLAHE(image, Min, Max)
[iHeight, iWidth] = size(image);
grayLevel = 65535;
plateauValue = grayLevel;
% 计算经过平台值graylevel调整后的直方图plateauPhist,及累积直方图
[plateauPhist, lPhist, img] = plateauAlg(image, grayLevel, plateauValue,iHeight, iWidth);

% 平台值S
S = 100;
Phist_clipped = plateauPhist;
excessPixel = 0;
lowPhist = plateauPhist;
for i = 1: grayLevel
    if plateauPhist(i) > S
        excessPixel = plateauPhist(i) - S + excessPixel;
        Phist_clipped(i) = S;
        lowPhist(i) = 0;  % 提取小于阈值S的部分
    end
end


Sum_lowPhist = sum(lowPhist);
for i = 1: grayLevel
    normalLowPhist(i) = lowPhist(i) / Sum_lowPhist;
end

phist_New = Phist_clipped;
numLowLevel = 0;
sumLowPixel = 0;
for i = 1: grayLevel
    if Phist_clipped(i) < S & Phist_clipped(i) > 1
        phist_New(i) = floor(normalLowPhist(i) * excessPixel) + Phist_clipped(i);
        numLowLevel = numLowLevel + 1;
        if phist_New(i) > S
            phist_New(i) = S;
        end
        sumLowPixel = sumLowPixel + phist_New(i);
    end
end

phist_New = phist_New ./sum(phist_New);

for i = 1: grayLevel-1
    if i == 1
        lPhist_new(i) = phist_New(i);
    else
        lPhist_new(i) = lPhist_new(i-1) + phist_New(i);
    end
end

end
        

3、输出

for i = 1: iHeight
    for j = 1: iWidth
        outImg1(i, j) = 255 * lPhist_new(Image(i, j) + 1) * CImage(i, j);
    end
end

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章