基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)
作为图像增强算法系列的第二篇文章,下面我们将要介绍功能强大、用途广泛、影响深远的对比度有限的自适应直方图均衡(CLAHE,Contrast Limited Adaptive Histogram Equalization)算法。尽管最初它仅仅是被当作一种图像增强算法被提出,但是现今在图像去雾、低照度图像增强,水下图像效果调节、以及数码照片改善等方面都有应用。这个算法的算法原理看似简单,但是实现起来却并不那么容易。我们将结合相应的Matlab代码来对其进行解释。希望你在阅读本文之前对朴素的直方图均衡算法有所了解,相关内容可以参见本系列的前一篇文章:基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)
先来看一下待处理的图像效果:
下面是利用CLAHE算法处理之后得到的两个效果(后面我们还会具体介绍我们所使用的策略):
效果图A 效果图B
对于一幅图像而言,它不同区域的对比度可能差别很大。可能有些地方很明亮,而有些地方又很暗淡。如果采用单一的直方图来对其进行调整显然并不是最好的选择。于是人们基于分块处理的思想提出了自适应的直方图均衡算法AHE。维基百科上说的也比较明白:AHE improves on this by transforming each pixel with a transformation function derived from a neighbourhood region. 但是这种方法有时候又会将一些噪声放大,这是我们所不希望看到的。于是荷兰乌得勒支大学的Zuiderveld教授又引入了CLAHE,利用一个对比度阈值来去除噪声的影响。特别地,为了提升计算速度以及去除分块处理所导致的块边缘过渡不平衡效应,他又建议采用双线性插值的方法。关于算法的介绍和描述,下面这两个资源已经讲得比较清楚。
[1] https://en.wikipedia.org/wiki/Adaptive_histogram_equalization#Contrast_Limited_AHE [2] K. Zuiderveld: Contrast Limited Adaptive Histogram Equalization. In: P. Heckbert: Graphics Gems IV, Academic Press 1994 (http://www.docin.com/p-119164091.html)
事实上,尽管这个算法原理,然而它实现起来却仍然有很多障碍。但在此之前,笔者还需说明的是,Matlab中已经集成了实现CLAHE的函数adapthisteq(),如果你仅仅需要一个结果,其实直接使用这个函数就是最好的选择。我给出一些示例代码用以生成前面给出之效果。函数adapthisteq()只能用来处理灰度图,如果要处理彩色图像,则需要结合自己编写的代码来完成。上一篇文章介绍了对彩色图像进行直方图均衡的两种主要策略:一种是对R、G、B三个通道分别进行处理;另外一种是转换到另外一个色彩空间中再进行处理,例如HSV(转换后只需对V通道进行处理即可)。
首先,我们给出对R、G、B三个通道分别使用adapthisteq()函数进行处理的示例代码:
img = imread('space.jpg');
rimg = img(:,:,1);
gimg = img(:,:,2);
bimg = img(:,:,3);
resultr = adapthisteq(rimg);
resultg = adapthisteq(gimg);
resultb = adapthisteq(bimg);
result = cat(3, resultr, resultg, resultb);
imshow(result);
上述程序之结果效果图A所示。
下面程序将原图像的色彩空间转换到LAB空间之后再对L通道进行处理。
clear;
img = imread('space.jpg');
cform2lab = makecform('srgb2lab');
LAB = applycform(img, cform2lab);
L = LAB(:,:,1);
LAB(:,:,1) = adapthisteq(L);
cform2srgb = makecform('lab2srgb');
J = applycform(LAB, cform2srgb);
imshow(J);
上述程序所得之结果如图B所示。
如果你希望把这个算法进一步提升和推广,利用用于图像去雾、低照度图像改善和水下图像处理,那么仅仅知其然是显然不够的,你还必须知其所以然。希望我下面一步一步实现的代码能够帮你解开这方面的困惑。鉴于前面所列之文献已经给出了比较详细的算法描述,下面将不再重复这部分内容,转而采用Matlab代码来对其中的一些细节进行演示。
首先来从灰度图的CLAHE处理开始我们的讨论。为此清理一下Matlab的环境。然后,读入一张图片(并将其转化灰度图),获取图片的长、宽、像素灰度的最大值、最小值等
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)(02-23)
- 基于SDI接口的实时图像增强显示系统(10-29)
- 基于FPGA的彩色图像增强系统设计(10-26)
- 基于Matlab的图像增强与复原技术在SEM图像中的应(04-15)
- 基于FPGA的图像增强视频处理系统(04-09)
- 基于非抽样Contourlet变换的红外图像增强算法(01-27)