直方图均衡(HE)与局部色调映射(LTM) .

直方图均衡(Histogram Equalization)是图像处理中一个十分基础的概念,具有调整图像灰度,增强对比度的作用。

   限制对比度自适应直方图均衡(Contrast Limited Adaptive Histogram Equalization,CLAHE),关于该算法的中文原理性描述可以参考网址:http://www.cnblogs.com/Imageshop/archive/2013/04/07/3006334.html 

   下面我按照自己的理解来介绍一下CLAHE算法:

   自适应直方图均衡(AHE)算法,对于图像中存在明显比其他区域亮或者暗的地方时,普通的直方图均衡算法就不能将该处的细节信息描述出来。AHE算法通过在当前处理像素周边的一个矩形区域内进行直方图均衡,来达到扩大局部对比度,显示平滑区域细节的作用。

   AHE算法的2个属性:1、AHE算法处理的局部领域,矩形领域小,局部对比度强,矩形领域大,局部对比度弱。2、如果矩形区域内的图像块信息比较平坦,灰度接近,其灰度直方图呈尖状,在直方图均衡的过程中就可能会出现过度放大噪声的情况。

   CLAHE,对比度受限的自适应直方图均衡算法就能够有效的限制噪声放大的情形。下图表示的就是局部矩形领域内的灰度直方图,由于对比度放大的程度与像素点的概率分布直方图的曲线斜度成比例,所以为了限制对比度,将大于一定阈值的部分平均分配到直方图的其他地方,如右图所示,这样的话,通过限制CDF(累积分布函数)的斜率来一定程度限制对比度。

   

   插值过程,得到了CDF函数,也就获得了对应的亮度变换函数,在计算变换函数的时候可以通过插值过程来降低计算量。其中红色块(图像角点处)的变换函数是完全按照定义获得的,绿色块(图像边缘)的变换函数是通过旁边两个图像块的变换函数线性插值得到的,蓝色部分图像块的变换函数则是通过双线性插值得到。

   

   目前,Matlab和OpenCV中都已经集成了CLAHE函数,在Matlab中,就是函数J = adapthisteq(I);

   在OpenCV中,按照如下代码段处理:

 

  1. Ptr<CLAHEclahe = createCLAHE();   
  2. clahe ->apply(src,dst);  
Ptr<CLAHE> clahe = createCLAHE(); 
clahe ->apply(src,dst);

 

 

   局部色调映射(Local Tone Mapping)

   重建视觉外观是色调映射的终极目标。色调映射算法在降低高动态图像(HDR)范围的同时着力保护捕捉到的原始图像的外观。色调映射算子分两种策略,一种是全局的,另一种是局部的。

   全局映射算子

   每一个像素点将会根据它的全图特征和亮度信息进行映射,不管其空间位置几何。全局算子一个比较典型的例子就是色调曲线。全局色调映射在处理12位(12-bit)深度的图像的时候是完全OK的,当图像的动态范围特别高的时候,那就不行了。这是因为所有的像素点都采取同一种方式进行处理,根本就没有管它是在较亮区域还是较暗区域。这样的话,就是导致图像色调映射过后看起来很平坦,失去了其局部的细节信息。

   局部映射算子    像素点所在的空间位置会被考虑,在进行尺度变换的时候,所以,具有相同亮度值的两个像素点会被映射成不同的值,因为它们的空间位置周边的亮度信息可能不一样。局部色调映射需要考虑到每个像素点周围的亮度信息,这样这会使得计算量和内存的使用会更大,但是会有更好的结果。如果处理得当,局部色调映射会很好的保护高亮和阴影部分的局部对比度和细节信息。

   目前的一些色调映射算法:

   1、伽马压缩算法

   2、基于直方图均衡的压缩算法

   3、基于Retinex的算法

   4、基于梯度的压缩算法,等等

   下面给出2组基于CLAHE的LTP算法效果图:(测试图像在网上找的)

   Matlab代码如下:

  1. %% local tone mapping  
  2. clc,clear ,close all  
  3. % src = imread('m_ImageDemosaic.bmp');  
  4. src = imread('C:\Users\Administrator\Desktop\LTP5.png');  
  5. figure;imshow(src);  
  6. srcHDR = double(src) * 256;  
  7. hsv = rgb2hsv(srcHDR);  
  8. figure;imshow(uint16(srcHDR))  
  9. J = adapthisteq(uint16(hsv(:,:,3)));  
  10. hsv(:,:,3) = double(J);  
  11. dstHDR = hsv2rgb(hsv);  
  12. figure;imshow(uint16(dstHDR))  
  13. imwrite(uint16(dstHDR),'C:\Users\Administrator\Desktop\LTP5_1.png')  
%% local tone mapping
clc,clear ,close all
% src = imread('m_ImageDemosaic.bmp');
src = imread('C:\Users\Administrator\Desktop\LTP5.png');
figure;imshow(src);
srcHDR = double(src) * 256;
hsv = rgb2hsv(srcHDR);
figure;imshow(uint16(srcHDR))
J = adapthisteq(uint16(hsv(:,:,3)));
hsv(:,:,3) = double(J);
dstHDR = hsv2rgb(hsv);
figure;imshow(uint16(dstHDR))
imwrite(uint16(dstHDR),'C:\Users\Administrator\Desktop\LTP5_1.png')

   由于获取不到源HDR,所以自己先将8-bit图像映射到16-bit之后再进行试验

 

   测试图像来源链接:http://www.vista123.com/vista/9226.htmlhttp://www.nipic.com/show/7139458.html

 

 

        

         

 
posted @ 2016-08-12 18:11  老拙  阅读(11634)  评论(1编辑  收藏  举报