Contrast Limited Adaptive Histogram Equalization

1. 背景

1.1. 对比度和直方图均衡HE

“对比度contrast ratio”这一概念,类似于“动态范围dynamic range”,衡量的是图像中亮区与暗区的比例。

对比度实际上没有统一的测量标准,参见:维基百科

但我们知道,对比度是影响图像视觉效果的重要因素。

对比度小的图像,其色彩层次少,看起来要么太亮,要么太暗。如下图(太暗):

实际上摄影师是为了追求这种效果啦,但我们还是拿来做一个demo。

利用MATLAB内置的histeq函数,可以得到对比度增强的图片:

img=imread('Cloudy Night View.jpg');
rimg=img(:,:,1);
gimg=img(:,:,2);
bimg=img(:,:,3);
resultr=histeq(rimg);
resultg=histeq(gimg);
resultb=histeq(bimg);
result=cat(3,resultr,resultg,resultb);
imwrite(result,'result.jpg')

图像清晰了太多有没有!!!很多隐藏的细节都被挖掘出来了。

当然,这个结果有些色彩失真。我们尝试在Lab color space上进行,据说是最接近人眼特性的色彩空间:

cform2lab = makecform('srgb2lab');
imgLAB = applycform(img, cform2lab);
L = imgLAB(:,:,1);
imgLAB(:,:,1) = histeq(L);
cform2srgb = makecform('lab2srgb');
result2 = applycform(imgLAB, cform2srgb);
imwrite(result2,'result2.jpg')

可以看到,色彩失真有所改善。

直方图均衡的本质是灰度值映射。而映射函数可以由分布曲线(累积直方图)得到:

\[D_B=\frac {D_{max}}{A_0} \sum_{i=0}^{D_A}H_i
\]

其中 \(A_0\) 是像素总数(图像面积),\(D_{max}\) 是最大灰度值,\(D_A、D_B\) 分别是转换前、后的灰度值,\(H_i\) 是第 \(i\) 级灰度的像素个数。

例如原直方图为:

  • 灰度值0到120,累积像素个数都为0,因此灰度值0到120都映射到灰度值0;

  • 此后黑线开始上升,其纵坐标就是映射到的灰度值(当然还有系数 $ \frac {D_{max}}{A_0} $ )。

  • 灰度值200左右,黑线饱和,因此其后的灰度值都映射到最大灰度值255。

经过均衡后的直方图为:

综上,HE后的直方图实际上是原直方图的拉伸,只是左右拉伸程度是变化的,取决于原直方图的幅度变化。

参见:维基百科 histogram equalization

1.2 HE的问题

以上是直方图均衡Histogram Equalization的简单应用。事实上,HE最初用在医疗图像上。以下图为例:

如果只应用简单的HE,结果如图:

尽管组织“点亮”了,但底噪一样被“点亮”了。

1.3 AHE

在CLAHE提出以前,学者还提出了自适应直方图均衡Adaptive Histogram Equalization。

AHE的思想很简单:"Since our eyes adapt to the local context of images to evaluate their contents, it makes sense to optimize local image contrast (Pizer et al. 1987)."

大体上是:为了改善局部对比度,我们采用块操作。此时HE在每一个块上都会最优,从而实现各个局部最优。进一步,为了避免边界效应,我们组合块时采用双线性插值法,而不是简单的合并。

根据实验结果,AHE在目标区域表现比HE更出色,但底噪问题仍然没有解决。

1.4 底噪问题

我们思考一下底噪问题的本质。

不妨考虑极端情况。假设原直方图中只有一个柱子,对应灰度值为0。这就是说,这本应该是一个全黑的块。

然鹅,根据HE原理,由于灰度值0处

\[D_B=\frac {D_{max}}{A_0} \sum_{i=0}^{D_A}H_i = 255
\]

因此灰度值0的柱子变成了灰度值255的柱子,整幅图像变成了全1阵(为什么是1不是255?这里涉及到MATLAB图像格式的问题,不赘述)。即,全黑图像变成了全白图像。

因此,我们应该限制分布函数cumulative distribution function的斜率。

大斜率导致低灰度值映射到高灰度值,使原本集中的黑色背景“点亮”。这就是CLAHE的根本思想。

2. CLAHE

2.1 效果展示

References:

Karel Zuiderveld, "Contrast Limited Adaptive Histogram Equalization", Graphics Gems IV, p. 474-485, code: p. 479-484

MATLAB内置了adapthisteq函数,可以实现CLAHE算法。我们以Human Knee为例,看看CLAHE效果:

不仅目标被点亮了,而且低噪也被抑制了!

2.2 算法格式和细节

原作中给出的是C语言程序实现。这里我们研究MATLAB内置函数adapthisteq的源代码。

函数的输入方式有两种:

J = ADAPTHISTEQ(I)
J = ADAPTHISTEQ(I,PARAM1,VAL1,PARAM2,VAL2...)

显然第一种使用的是默认参数。

参数有:

  • NumTiles:是一个[M N]行向量,表征tile的行和列数。默认8x8。最好通过实验确定。

  • ClipLimit:0到1的一个标量,表征最大最大clip。显然是归一化的。默认0.01。如果太大,CLAHE退化为AHE。

  • NBins:输出图像直方图的柱子个数。因此输入图像和输出图像的位数不一定相同,NBins越大,动态范围越大,但速度越慢。默认为256。

  • Range:要么是'original',要么是'full'。前者限制变换范围在[min(I(

    Paper | Contrast Limited Adaptive Histogram Equalization的更多相关文章

    1. 限制对比度自适应直方图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)

      转自:http://www.cnblogs.com/Imageshop/archive/2013/04/07/3006334.html 一.自适应直方图均衡化(Adaptive histgram eq ...

    2. 灰度图像--图像增强 直方图均衡化(Histogram equalization)

      灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...

    3. Histogram Equalization

      转载请注明出处. Histogram Equalization 也就是直方图均衡化, 是一种常用的通过直方图处理来增强图像的方法. 对于一副灰度图像,其像素范围一般在0~255之间,我们记nk(0&l ...

    4. 灰度图的直方图均衡化(Histogram Equalization)原理与 Python 实现

      原理 直方图均衡化是一种通过使用图像直方图,调整对比度的图像处理方法:通过对图像的强度(intensity)进行某种非线性变换,使得变换后的图像直方图为近似均匀分布,从而,达到提高图像对比度和增强图片 ...

    5. 彩色图像直方图均衡(Histogram Equalization)

      直方图均衡(Histogram Equalization) 一般步骤: 1.统计直方图每个灰度级出现的次数(概率) 2.累计归一化的直方图 3.计算新的像素值 重要:彩色直方图均衡不能对RGB分别做再 ...

    6. OpenCV-Python : 直方图

      啥叫直方图 直方图简单来说就是图像中每个像素值的个数统计,比如一副灰度图中像素值为0的有多少个,1的有多少个... 在计算直方图之前,先了解几个术语: dims:要计算的通道数,对于灰度图dims=1 ...

    7. VINS(二)Feature Detection and Tracking

      系统入口是feature_tracker_node.cpp文件中的main函数 1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括: ROS中 ...

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

      直方图均衡(Histogram Equalization)是图像处理中一个十分基础的概念,具有调整图像灰度,增强对比度的作用.    限制对比度自适应直方图均衡(Contrast Limited Ad ...

    9. python skimage图像处理(一)

      python skimage图像处理(一) This blog is from: https://www.jianshu.com/p/f2e88197e81d 基于python脚本语言开发的数字图片处 ...

    随机推荐

    1. 【WP8】WebBrowser相关

      2014年09月02日更新 今天用了一下WebBrowser,在使用过程中也遇到了一些问题,在这里做一下记录 虽然WebBrowser比较重,会比较影响性能(除非一定要用到它,否则尽量少用),但有时候 ...

    2. VR系统的分类

      转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 根据用户参与和沉浸感的程度,通常把虚拟现实分为4大类:桌面虚拟现实系统.沉浸式虚拟现实系统.增强虚拟现实 ...

    3. HttpHander与httpModel配置与应用

      ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll, ...

    4. Properties类的用法

      在java.util包下面有一个类Properties,该类主要用于读取以项目的配置文件(以.properties结尾的文件和xml文件). 一. Properties结构 类继承结构如下: clas ...

    5. 如何进去bios设置

      1.BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计算机内主板上 ...

    6. 用Java发送邮件

      要用Java发送邮件,除过JDK本身的jar包之外,还需要两个额外的jar包:JavaMail和JAF.当然,如果你使用的JavaEE的JDK,那就不用单独去网上下载了,因为JavaEE的JDK中已经 ...

    7. 使用AdvancedInstaller打包web工程设置tomcat端口的方法

      原文:使用AdvancedInstaller打包web工程设置tomcat端口的方法 1.首先,要把你要打包的tomcat下的server.xml文件删掉,因为tomcat自带的serv ...

    8. OpenGL网络资源

      转 十大OpenGL教程 1.http://nehe.gamedev.net/这个是我觉得全世界最知名的OpenGL教程,而且有网友将其中48个教程翻译成了中文http://www.owlei.com ...

    9. [TJOI2015]概率论

      [TJOI2015]概率论 史上最短黑题 看起来一脸懵逼,没有取模,1e-9 根据期望定义,发现 分母是一个卡特兰数,,,,不能直接算 所以考虑怎么消掉一些东西 gn表示n个点的叶子个数和,fn表示n ...

    10. blfs(systemd版本)学习笔记-构建gnome桌面系统后的配置及安装的应用

      我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.构建安装ibus-libpinyin的笔记地址:https://www.cnblogs.com/renren-study-n ...