图像增强---直方图均衡化

目录

  • 一. 基本概念
    • 1.灰度直方图的定义
    • 2.灰度直方图的性质
    • 3.直方图与图像清晰性的关系
  • 二.直方图均衡化
    • 1.定义
    • 2.图像灰度变换函数条件
    • 3.直方图均衡化的计算过程
  • 三.直方图规定化
    • 1.定义
    • 2.直方图规定化的步骤:
  • 四.自适应直方图均衡化(AHE)
    • 1.定义
    • 2.缺点
    • 3.CLAHE

一. 基本概念

1.灰度直方图的定义

数字图像中各级灰度级与其出现的频数间的统计关系,可表示为:
在这里插入图片描述
且:
在这里插入图片描述
其中,k为图像的第k级灰度值,是中灰度值为k的像素个数;
n是图像的总像素个数;
L是灰度级数。

2.灰度直方图的性质

①直方图的位置缺失性;
②直方图与图像的一对多特性;
③直方图的可叠加性。

3.直方图与图像清晰性的关系

直方图反映了图像的清晰程度,当直方图均匀分布时,图像最清晰。
由此,我们可以利用直方图来达到使图像清晰的目的。

二.直方图均衡化

1.定义

通过原始图像的灰度非线性变换,使其直方图变成均匀分布,以增加图像灰度值的动态范围,从而达到增强图像整体对比度,使图像变清晰的效果。

2.图像灰度变换函数条件

①对0≤r≤1,s=T[r]是单调增函数;
②对0≤r≤1,0≤s=T[r]≤1。

同理,反变换r=T-1[s]应也满足单调增。

3.直方图均衡化的计算过程

①列出原始图像和变换后图像的灰度级:i,j=0,1,…,L-1,其中L是灰度级数;
②统计原图像各灰度级的像素个数ni;
③计算原始图像直方图:P(i)=ni / n,其中n为原始图像像素总个数;
④计算累积直方图:
在这里插入图片描述
⑤利用灰度变换函数计算变换后的灰度值,并四舍五入取整:
在这里插入图片描述
⑥确定灰度变换关系f(m,n)=i,据此将原图像的灰度值修正为:
g(m,n)=j;
⑦统计变换后各灰度级的像素个数nj
⑧计算变换后图像的直方图:P(j)=nj / n

/*直方图均衡化*/
void Histogram_equalization(Mat& src, Mat& dst)
{
	CV_Assert(src.depth() == CV_8U);     //仅接受uchar图像
	src.copyTo(dst);
	int nr = src.rows;
	int nc = src.cols;
	int pixnum = nr * nc;
	//灰度图像
	if (src.channels() == 1)
	{
		//统计直方图
		int gray[256] = { 0 };
		for (int i = 1; i < nr; i++)
		{
			const uchar* ptr = src.ptr<uchar>(i);
			for (int j = 0; j < nc; j++)
			{
				gray[ptr[j]]++;
			}
		}
		//计算分布函数
		int LUT[256];
		int sum = 0;
		for (int k = 0; k < 256; k++)
		{
			sum += gray[k];
			LUT[k] = 255 * sum / pixnum;
		}
		//灰度变换(赋值)
		for (int i = 1; i < nr; i++)
		{
			const uchar* ptr_src = src.ptr<uchar>(i);
			uchar* ptr_dst = dst.ptr<uchar>(i);
			for (int j = 0; j < nc; j++)
			{
				ptr_dst[j] = LUT[ptr_src[j]];
			}
		}

	}
	//彩色图像
	else
	{
		//统计直方图
		int B[256] = { 0 };
		int G[256] = { 0 };
		int R[256] = { 0 };
		for (int i = 0; i < nr; i++)
		{
			for (int j = 0; j < nc; j++)
			{
				B[src.at<Vec3b>(i, j)[0]]++;
				G[src.at<Vec3b>(i, j)[1]]++;
				R[src.at<Vec3b>(i, j)[2]]++;
			}
		}
		//计算分布函数
		int LUT_B[256], LUT_G[256], LUT_R[256];
		int sum_B = 0, sum_G = 0, sum_R = 0;
		for (int k = 0; k < 256; k++)
		{
			sum_B += B[k];
			sum_G += G[k];
			sum_R += R[k];
			LUT_B[k] = 255 * sum_B / pixnum;
			LUT_G[k] = 255 * sum_G / pixnum;
			LUT_R[k] = 255 * sum_R / pixnum;
		}
		//灰度变换
		for (int i = 0; i < nr; i++)
		{
			for (int j = 0; j < nc; j++)
			{
				dst.at<Vec3b>(i, j)[0] = LUT_B[src.at<Vec3b>(i, j)[0]];
				dst.at<Vec3b>(i, j)[1] = LUT_B[src.at<Vec3b>(i, j)[1]];
				dst.at<Vec3b>(i, j)[2] = LUT_B[src.at<Vec3b>(i, j)[2]];
			}
		}
	}
}

图像增强---直方图均衡化_第1张图片
图像增强---直方图均衡化_第2张图片

三.直方图规定化

1.定义

直方图均衡化能自动增强整个图像对比度,结果得到全局均匀化直方图,但实际应用中有时要求突出感兴趣灰度范围,即修正直方图使其具有要求的形式。
图像增强---直方图均衡化_第3张图片

2.直方图规定化的步骤:

①对原直方图均衡化,即求其累积直方图P~i~: ![在这里插入图片描述](https://img-blog.csdnimg.cn/035b67d9ee364c04821ba21fc86cdcda.png) ②对规定直方图均衡化,即求其累计直方图P~j~: ![在这里插入图片描述](https://img-blog.csdnimg.cn/27b245bca4d044a0830c324895523234.png) ③按 P~j~ --> P~i~ 最靠近的原则进行 i --> j 的变换; ④求出 i-->j 的变换函数,对原图像进行灰度变换 j=T[i]。 其中,P~r~(i)为原数字图像的直方图,P~r~(j)为规定直方图,i 和 j 分别为原图像和期望图像的灰度级,且具有相同的取值范围,即i,j=0,1,2,....,L-1。

四.自适应直方图均衡化(AHE)

1.定义

AHE是一种用来改善图像对比度的图像处理技术,它与传统的直方图均衡化相比,不同点主要在于,AHE通过计算图像每一个显著区域的直方图,来重新分布图像的亮度值,因此它更适合用于来改善图像的局部对比度,以及增强图像边缘信息,利于分割。
图像增强---直方图均衡化_第4张图片

2.缺点

AHE在增强对比度的同时会增强图像同质(均匀)区域的噪声,因此作为AHE的改进,CLAHE可以有效降低这种噪声的增强。

3.CLAHE

CLAHE与AHE最大的不同在于前者对对比度进行了限制,这一特性也可以被应用到全局的直方图均衡中,即Contrast Limited HE,简称CLHE,但实际中他很少被用到。
CLAHE中,每一个像素邻域都要进行对比度限制,从而得到对应的变换函数,被用来降低AHE中噪声的增强,这主要是通过限制AHE中的对比度增强来实现的。
图像增强---直方图均衡化_第5张图片
图像增强---直方图均衡化_第6张图片

你可能感兴趣的:(数字图像处理,图像处理,计算机视觉,opencv,c++)