`

直方图均衡化的原理及其实现

 
阅读更多

    直方图均衡化在图像处理领域中运用非常广泛,而且非常简单易实现。

    首先我们了解一下什么是图像的直方图

    设图像的灰度范围为[a,b],r为此灰度范围内的任一灰度级,p(r)为这幅图像中灰度级为r的像素出现的频率,可以看出p(r)是r的函数。该函数的图形称为这幅图像的直方图。

     p(r)=灰度为r的像素数/图像上的总像素数

    
                                                                      图像灰度级统计信息
                                                                      图像灰度直方图
                                 
          
       原灰度图                     灰度直方图
    

    可以很清楚地看出,灰度直方图抛弃了原灰度图像的空间位置信息,反映了某一像素值在灰度图中出现的频率或者概率信息。如上图所示,可以很清楚地看出0-100灰度值所出现的频率非常大,且越趋近于0概率越高;而灰度值大于200后,出现频率大大降低。由此可以判断出,该图像整体较暗,细节部分不够突出。

    于是这里我们引入---直方图均衡化的方法,希望按照一定的变换公式,将原图映射到新图,使得新图在原图的基础上,直方图分布更加均匀,这样图像的明暗分布更加均匀,给人的视觉效果就是对比度好,细节清晰。

    那么问题的关键是,如何确定这个变换公式呢?

    均衡化方法中,使用直方图的累积分布函数作为变换公式:

    其中,

    实际上就是用某灰度级的累积概率来代替其原出现概率,得到映射后新的灰度值(累积概率乘以最大灰度值)。
    举个例子来说:

      rk代表原图的八个灰度级;nk代表每个灰度级出现的频数;Prk代表每个灰度级出现的概率;Sk代表累积概率;Ps代表新图中rk所对应的出现概率。

     于是,很容易得到,例如:

  原图rk=0,累积概率Sk=1/7,于是其对应的新图灰度值为1*1/7=1/7。

  经过意义映射之后,可以发现,新图中灰度级为0的出现概率为0,于是在rk=0时Ps=0;新图中灰度级为1/7的出现概率为0.19,于是在rk=1/7时Ps=0.19···

  以此类推,很容易换算出新图的灰度级。

  了解了直方图均衡化的原理,那么编程实际上就是小菜一碟了。无论是使用Matlab还是OpenCV,直方图均衡化都很好实现。这里要提一点的就是Matlab相对来说更加地方便,对于直方图的获取与绘制,都有现成的函数可供调用,而OpenCV相对来说麻烦一点,需要自己写绘制函数。

  另外,对输入进来的图像,首先要进行通道数的转换,比如说传入进来的是.jpg格式的图像,那么无论从外表上看它是不是一个灰度图像,读进来的都是三通道图像,所以,往往第一步是需要将多通道图像转换成单通道图像。

 

效果:
           
             原图                           均衡化后

核心函数(来源于网络,我是大自然的搬运工)

1.直方图均衡化

 

void MyEqualizeHist_color(IplImage* src, int color)
{
	if (color == 1)
	{//多通道
		IplImage* imgChannel[4] = { 0, 0, 0, 0 };
		IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
		int i;
		for (i = 0; i < src->nChannels; i++)
		{
			imgChannel[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);  //要求单通道图像才能直方图均衡化  
		}
		//通道分离  
		cvSplit(src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3]);//BGRA  
		for (i = 0; i < dst->nChannels; i++)
		{
			//直方图均衡化,原始图像和目标图像必须是单通道  
			cvEqualizeHist(imgChannel[i], imgChannel[i]);
		}
		//通道组合  
		cvMerge(imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst);
		cvNamedWindow("src", 1);
		cvShowImage("src", src);
		cvNamedWindow("Equalize", 1);
		cvShowImage("Equalize", dst);
	}
	else
	{//单通道
		IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
		cvEqualizeHist(src, dst);
		cvNamedWindow("src", 1);
		cvShowImage("src", src);
		cvNamedWindow("Equalize", 1);
		cvShowImage("Equalize", dst);
	}
}

 2.绘制灰度直方图(单通道灰度图像)

 

IplImage* src = cvLoadImage("orange.JPG");//读取图像
IplImage* gray = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
cvCvtColor(src, gray, CV_BGR2GRAY);//彩色图像灰度化
CvHistogram *pcvHistogram = CreateGrayImageHist(&gray);//创建一个灰度直方图
int nHistImageWidth = 255; //0到255个灰度级
int nHistImageHeight = 200;  //直方图图像高度  
int nScale = 2;
IplImage* pHistImage = 
CreateHisogramImage(nHistImageWidth, nScale,nHistImageHeight, pcvHistogram);//得到灰度直方图
cvNamedWindow("Hist", 1);
cvShowImage("Hist", pHistImage);
/****
FillWhite是一个填充函数,将pImage填充成白色
*****/
void FillWhite(IplImage *pImage)
{
cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);
}
/****
创建灰度图像的直方图  
*****/
CvHistogram* CreateGrayImageHist(IplImage **ppImage)
{
	int nHistSize = 256;//灰度数
	float fRange[] = { 0, 255 };  //灰度级的范围    
	float *pfRanges[] = { fRange };
	CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);//创建直方图
	cvCalcHist(ppImage, pcvHistogram);//计算ppImage的直方图
	return pcvHistogram;
}
/****
根据直方图创建直方图图像、
*****/  
IplImage * CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram)
{
IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);
FillWhite(pHistImage);
//统计直方图中的最大直方块  
float fMaxHistValue = 0;
cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);
//分别将每个直方块的值绘制到图中  
int i;
for (i = 0; i < nImageWidth; i++)
{
float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小  
int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight);  //要绘制的高度  
cvRectangle(pHistImage,
		  cvPoint(i * nScale, nImageHeight - 1),
		  cvPoint((i + 1) * nScale - 1, nImageHeight - nRealHeight),
		  cvScalar(i, 0, 0, 0),
		  CV_FILLED
			);
	}
return pHistImage;
}

 

  • 大小: 14.5 KB
  • 大小: 7.8 KB
  • 大小: 52.1 KB
  • 大小: 13.9 KB
  • 大小: 2.6 KB
  • 大小: 2.1 KB
  • 大小: 17.1 KB
  • 大小: 46.2 KB
  • 大小: 3.9 KB
  • 大小: 111.5 KB
分享到:
评论

相关推荐

    C++直方图均衡化源代码

    一个基于c++和OpenCV的直方图均衡化源代码图像处理程序。供大家参考。

    OpenCV直方图均衡化

    理解直方图和直方图均衡化的原理,及其在图像和视频处理中的应用; 2、基于VS+opencv实现获取图像的直方图; 3、基于VS+opencv实现对图像的直方图均衡化;

    数字图像处理实验二 直方图及其均衡化

    理解和掌握直方图、直方图均衡、直方图匹配的原理和实现方法;自己编程实现均衡化与matlab 函数的结果进行比较;采用直方图匹配重新处理图像,匹配直方图自选, 可采用多峰值高斯函数来模拟此类型直方图;采用局部...

    c++数字图像处理 直方图均衡化 完整代码

    不是我要的分多,网上的找了很长时间都不能用,现在我给出完整代码,非常简洁简单,直接操作,绝对超值。这是我的上机作业,还没交,先发,给大家共享。

    基于直方图的图像增强及其MATLAB实现

    图像增强是数字图像的预处理 ,对图像整体或局部特征能有效地改善。我们讨论了基于直方图的均衡化和规 定化处理的图像增强技术基本...结果表明 ,直方图均衡化和规定化处理能有 效改善灰度图像的对比度差和灰度动态范围。

    基于灰度直方图的图像增强及其VC++

    图像增强是数字图像的预处理。能有效地改善图像整体或局部特征....同时以一个灰度图像为例,在Vc++集成开发环境下实现了直方图均衡化和规定化增强处理,并给出了具体程序、实验结果图像及直方图.

    基于FPGA的数字图像处理原理及应用代码.zip

    本书首先介绍FPGA程序设计和图像与视频处理的关键基础理论,然后通过实例代码详细讲解了如何利用FPGA实现直方图操作中的直方图统计/均衡化/线性拉伸/规定化、线性滤波器操作中的均值滤波器、Sobel算子(滤波、求模、...

    数字图像处理期末大作业暨课程考核报告.rar

    1、绘制灰度直方图,实现直方图均衡化;(10分) 2、灰度图像的对比度增强;(5分) 3、图形的几何变换;(5分) 4、图像加噪(用输入参数控制不同噪声),然后使用空域和频域进行滤波处理(10分) 5、采用...

    图片预处理笔记

    XYZ图片存储原理RGB三通道彩色图单通道灰度图图片存储原理图像增强的目标图像处理方法特征提取方法直方图均值化缺点自适应直方图均衡AHE缺点限制对比度自适应直方图均衡CLAHE形态学运算空间域处理及其变换padding...

    MATLAB图形图像处理

    13.1.3 直方图均衡化 13.1.4 直方图规定化 13.2 空域滤波增强 13.2.1 平滑滤波器 13.2.2 锐化滤波器 13.3 频域增强 13.3.1 低通滤波器 13.3.2 高通滤波器 13.3.3 同态滤波器 13.3.4 频域增强 MATLAB 实例 ...

    matlab6.5图形图像处理源程序

    13.1.3 直方图均衡化 13.1.4 直方图规定化 13.2 空域滤波增强 13.2.1 平滑滤波器 13.2.2 锐化滤波器 13.3 频域增强 13.3.1 低通滤波器 13.3.2 高通滤波器 13.3.3 同态滤波器 13.3.4 频域增强 MATLAB 实例 ...

    matlab6.5图形图象处理源程序

    13.1.3 直方图均衡化 13.1.4 直方图规定化 13.2 空域滤波增强 13.2.1 平滑滤波器 13.2.2 锐化滤波器 13.3 频域增强 13.3.1 低通滤波器 13.3.2 高通滤波器 13.3.3 同态滤波器 13.3.4 频域增强 MATLAB 实例 ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    13.1.3 直方图均衡化 13.1.4 直方图规定化 13.2 空域滤波增强 13.2.1 平滑滤波器 13.2.2 锐化滤波器 13.3 频域增强 13.3.1 低通滤波器 13.3.2 高通滤波器 13.3.3 同态滤波器 13.3.4 频域增强 ...

    VC++ matlab图像处理

    13.1.3 直方图均衡化 13.1.4 直方图规定化 13.2 空域滤波增强 13.2.1 平滑滤波器 13.2.2 锐化滤波器 13.3 频域增强 13.3.1 低通滤波器 13.3.2 高通滤波器 13.3.3 同态滤波器 13.3.4 频域增强 MATLAB 实例 ...

    通信工程专业毕业设计题目列举.doc

    基于DSP的数字图像直方图均衡化增强算法研究 5.基于多尺度小波的图像增强算法研究 6.基于维纳滤波的图像增强算法研究 1. 身份认证服务器认证服务模块开发 2. 身份认证服务器认证配置管理模块开发 3. 身份认证服务器...

    计算机视觉-python进行基本图像处理

    文章目录语言环境1、python环境的下载2、编辑器下载1、绘制图像基本轮廓以及直方图1.1基本原理1.2代码设计1.3结果展示2、图像去燥2.1基本原理2.2 代码设计2.3 结果展示3、图像均衡化3.1基本原理3.2代码设计3.3结果...

    (完整版)matlab毕业课程设计-图像处理.doc

    并进 行最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的和 旋转操作,并保存,比较几种插值的效果,以及对图像进行直方图和直方图均衡并加入 噪声进行对比,达到本次课程设计的目的。 ...

    通信工程专业毕业设计题目列举..doc

    基于DSP的数字图像直方图均衡化增强算法研究 5.基于多尺度小波的图像增强算法研究 6.基于维纳滤波的图像增强算法研究 1. 身份认证服务器认证服务模块开发 2. 身份认证服务器认证配置管理模块开发 3. 身份认证...

Global site tag (gtag.js) - Google Analytics