自适应直方图均衡化(Adaptive histgram equalization/AHE)
普通直方图均衡化使用从图像直方图中导出的相同变换来对所有像素进行变换。当整个图像的像素值分布相似时,这种方法很有效。然而,当图像中包含的区域明显比大多数图像亮或暗时,这些区域的对比度将不会得到足够的增强。自适应直方图均衡化(AHE)改进了这一点,通过转换每个像素的转换函数派生自一个邻域。它最初被开发用于飞机驾驶舱显示器。
ANE主要是基于分块处理的思想用来提高图像对比度的一种算法,其特点是通过极端图像的局部直方图,然后通过重新分布图像的亮度来改变图像对比度。主要用于获取图像更多的细节!普通的AHE倾向于在图像的近恒定区域过度放大对比度,因为这些区域的直方图高度集中。因此,AHE可能会导致噪声在接近恒定的区域被放大。
限制对比度自适应直方图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)
普通的AHE倾向于在图像的近恒定区域过度放大对比度,因为这些区域的直方图高度集中。因此,AHE可能会导致噪声在接近恒定的区域被放大。对比度受限AHE (CLAHE)是自适应直方图均衡化的一种变体,它限制了对比度的放大,从而减少了噪声放大的问题。在网格中,在给定像素值附近的对比度放大由变换函数的斜率给出。这与邻域累积分布函数(CDF)的斜率成正比,因此与该像素值处的直方图值成正比。CLAHE通过在计算CDF之前将直方图裁剪到预定义值来限制放大。这限制了CDF的斜率,因此也限制了变换函数的斜率。直方图被裁剪的值,即所谓的剪切极限,取决于直方图的归一化,因此也取决于邻域的大小。公共值将产生的放大限制在3到4之间。最好不要丢弃直方图中超过剪辑限制的部分,而是在所有直方图箱中均匀地重新分配。
重新分配将再次推动一些箱子超过剪辑限制(图中区域为绿色阴影),从而产生一个有效的剪辑限制,该限制大于规定的限制,其确切值取决于图像。如果不希望出现这种情况,则可以递归地重复重新分配过程,直到多余部分可以忽略为止。
自适应直方图均衡化的直接形式如上所示,无论有无对比度限制,都需要对图像中的每个像素计算不同的邻域直方图和变换函数。这使得该方法在计算上非常昂贵。插值可以在不影响结果质量的前提下显著提高效率。图像被分割成大小相同的矩形块,如下图的右侧所示。(8列8行64块是常用的选择。然后计算每个块的直方图、CDF和变换函数。转换函数适用于平铺中心像素,即图形左侧的黑色方块。所有其他像素都使用最接近中心像素的tile的四个转换函数进行转换,并分配插值值。对图像主体中的像素(蓝色阴影)进行双线性插值,对靠近边界的像素(绿色阴影)进行线性插值,对靠近角的像素(红色阴影)利用角块的变换函数进行变换。插值系数反映了像素在最近的瓦片中心像素之间的位置,因此当像素接近瓦片中心时,插值结果是连续的。
#include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat src, dst; src = imread("E:/win10/920.jpg"); if (src.empty()) { cout << "error" << endl; return -1; } cvtColor(src, src, CV_BGR2GRAY); imshow("input", src); //彩色图 /*vector<Mat> bgr_src; split(src, bgr_src); Ptr<CLAHE> clahe = createCLAHE(); Mat b_dst, g_dst, r_dst; vector<Mat> bgr_dst(3); clahe->apply(bgr_src[0], bgr_dst[0]); clahe->apply(bgr_src[1], bgr_dst[1]); clahe->apply(bgr_src[2], bgr_dst[2]);*/ //merge(bgr_dst, dst); Ptr<CLAHE> clahe = createCLAHE(); clahe->apply(src, dst); imshow("output", dst); waitKey(0); return 0; }