数字图像处理实验报告--直方图均衡化
数字图像处理实验报告直方图均衡化

数字图像处理实验报告直⽅图均衡化课程设计课程名称数字图像处理题⽬名称直⽅图均衡化学⽣学院信息⼯程学院专业班级 08级电信2班学号 3208002664 学⽣姓名陈慕仪指导教师曹江中2011年7 ⽉ 1 ⽇设计题⽬:直⽅图均衡化1、直⽅图的理论基础:(1)直⽅图概念:灰度直⽅图表⽰图像中每种灰度出现的频率。
(2)直⽅图的作⽤:反映⼀幅图像的灰度分布特性(3)直⽅图的计算:式中:n k 为图像中出现r k 级灰度的像素数,n 是图像像素总数,⽽n k /n 即为频数。
2、设计⽬的:产⽣⼀幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的⽬的。
3、直⽅图均衡化的效果:1)变换后直⽅图趋向平坦,灰级减少,灰度合并。
2)原始象含有象素数多的⼏个灰级间隔被拉⼤了,压缩的只是象素数少的⼏个灰度级,实际视觉能够接收的信息量⼤⼤地增强了,增加了图象的反差。
同时,也增加了图象的可视粒度。
4、离散情况下的直⽅图均衡化的算法:A 、列出原始图像的灰度级B 、统计各灰度级的像素数⽬C 、计算原始图像直⽅图各灰度级的频数D 、计算累积分布函数F 、应⽤以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,其中INT 为取整符号:G 、⽤的映射关系修改原始图像的灰度级,从⽽获得直⽅图近似为均匀分布的输出图像。
3、源程序代码// cqxhistView.cpp : implementation of the CCqxhistView class #include "stdafx.h" #include "cqxhist.h"#include "cqxhistDoc.h" #include "cqxhistView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__; #endif///////////////////////////////////////////////////////////////////////////// // CCqxhistViewIMPLEMENT_DYNCREATE(CCqxhistView, CView)BEGIN_MESSAGE_MAP(CCqxhistView, CView)1,,1,0,-=L j f j 1,,1,0,-=L j n j 1,,1,0,/)(-==L j n n f P j j f 1,,,1,0,)()(0-==∑=L k j f P f C k j jf]5.0)()[(min min max ++-=g f C g g INT g i nn r p kk =)(1,,2,1,010-=≤≤l k r k//{{AFX_MSG_MAP(CCqxhistView)ON_COMMAND(ID_OPEN_IMAGE, OnOpenImage)ON_COMMAND(ID_HIST_IMAGE, OnHistImage)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CCqxhistView construction/destruction CCqxhistView::CCqxhistView(){// TODO: add construction code here}CCqxhistView::~CCqxhistView(){}BOOL CCqxhistView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////// // CCqxhistView drawingvoid CCqxhistView::OnDraw(CDC* pDC){CCqxhistDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereif(m_dib.m_bLoaded==true) //判断是否加载图像{//获取图像宽和⾼int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();// 显⽰图像(具体的参数见CDIB类的该函数说明)m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI); } if(m_bHist==true){//绘制原图像的直⽅图CString str;int nh=m_dib.GetDIBHeight();int i;// 画坐标轴// 绘制坐标轴pDC->MoveTo(410,nh+20); //(410,nh+20 )是直⽅图的左上⾓坐标// 垂直轴pDC->LineTo(410,nh+200);//(410,nh+200 )是直⽅图的左下⾓坐标// ⽔平轴pDC->LineTo(710,nh+200);//(710,nh+200 )是直⽅图的右下⾓坐标// 写X轴刻度值str.Format("0");pDC->TextOut(410, nh+200+10, str);str.Format("50");pDC->TextOut(460, nh+200+10, str); str.Format("100");pDC->TextOut(510, nh+200+10, str); str.Format("150");pDC->TextOut(560, nh+200+10, str); str.Format("200");pDC->TextOut(610, nh+200+10, str); str.Format("255");pDC->TextOut(665, nh+200+10, str); // 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, nh+200-2); pDC->LineTo(i + 10, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 10, nh+200-2); pDC->LineTo(i + 10, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(705,nh+200-5); pDC->LineTo(710,nh+200);pDC->LineTo(705,nh+200+5);// 绘制y轴箭头pDC->MoveTo(410,nh+20);pDC->LineTo(405,nh+20+5);pDC->MoveTo(410,nh+20);pDC->LineTo(415,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_yuan[i]>max)max=m_yuan[i];for(i=0;i<256;i++){pDC->MoveTo(410+i,nh+200);pDC->LineTo(410+i,nh+200-(m_yuan[i]*160/max));}}if(m_bHist==true){//绘画直⽅图CString str;int nh=m_dib.GetDIBHeight();int i;// 画坐标轴// 绘制坐标轴pDC->MoveTo(10,nh+20); //(10,nh+20 )是直⽅图的左上⾓坐标// 垂直轴pDC->LineTo(10,nh+200);//(10,nh+200 )是直⽅图的左下⾓坐标// ⽔平轴pDC->LineTo(310,nh+200);//(310,nh+200 )是直⽅图的右下⾓坐标// 写X轴刻度值str.Format("0");pDC->TextOut(10, nh+200+10, str);str.Format("50");pDC->TextOut(60, nh+200+10, str);str.Format("100");pDC->TextOut(110, nh+200+10, str);str.Format("150");pDC->TextOut(160, nh+200+10, str);str.Format("200");pDC->TextOut(210, nh+200+10, str);str.Format("255");pDC->TextOut(265, nh+200+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(305,nh+200-5);pDC->LineTo(310,nh+200);pDC->LineTo(305,nh+200+5);// 绘制y轴箭头pDC->MoveTo(10,nh+20);pDC->LineTo(5,nh+20+5);pDC->MoveTo(10,nh+20);pDC->LineTo(15,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_hist[i]>max)max=m_hist[i];for(i=0;i<256;i++){pDC->MoveTo(10+i,nh+200);pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));}}}///////////////////////////////////////////////////////////////////////////// // CCqxhistView printing BOOL CCqxhistView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CCqxhistView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CCqxhistView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}///////////////////////////////////////////////////////////////////////////// // CCqxhistView diagnostics#ifdef _DEBUGvoid CCqxhistView::AssertValid() const{CView::AssertValid();}void CCqxhistView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CCqxhistDoc* CCqxhistView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCqxhistDoc)));return (CCqxhistDoc*)m_pDocument;}#endif //_DEBUG///////////////////////////////////////////////////////////////////////////// // CCqxhistView message handlersvoid CCqxhistView::OnOpenImage(){// TODO: Add your command handler code here// TODO: Add your command handler code herestatic char szFilter[]="BMP⽂件(*.bmp)|*.bmp||"; //定义过滤⽂件的类型 CFileDialog dlg(TRUE,"bmp",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);//定义⽂件对话框对象 CString filename;int ret=dlg.DoModal(); //运⾏打开⽂件对⽅框if(ret==IDOK){filename=dlg.GetFileName(); //获取所选择图像的路径 m_dib.LoadFromFile(filename); //加载图像if(!m_dib.m_bLoaded) //判断是否加载图像成功{AfxMessageBox("图像打不开");return;}for(int i=0;i<256;i++) //初始化直⽅图数组{ m_hist[i]=0;m_yuan[i]=0;}m_bHist=false;}{int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();for(int j=0;jfor(int i=0;i{BYTE temp=m_dib.m_pdata[j*nw+i];m_yuan[temp]++;}}Invalidate(1); //刷新屏幕}void CCqxhistView::OnHistImage(){// TODO: Add your command handler code here//功能:实现直⽅图均衡化////////////////////////////判断图像是否打开,没打开,则弹出提⽰框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox("图像还打开,请先打开图像!");return;}//获取图像宽和⾼int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j,k;int count[256]={0};//定义⼀个数组,⽤于存放灰度级个数float p[256];//定义⼀个数组,⽤于存放灰度级出现频率//对图像进⾏直⽅图均衡化处理for(i=0;ifor(j=0;j{k=m_dib.m_pdata[i*nw+j];//计算灰度级个数count[k]++;}for(k=0;k<256;k++)p[k]=count[k]/(nw*nh*1.0f);float c[256]={0};float sum=0.0;int ngray[256];//新的灰度级for(k=0;k<256;k++)//计算累积频率{sum+=p[k];c[k]=sum;ngray[k]=(int)(255.0*c[k]+0.5);}for(i=0;ifor(j=0;j{k=m_dib.m_pdata[i*nw+j];m_dib.m_pdata[i*nw+j]=ngray[k];}{int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();for(int j=0;jfor(int i=0;i{BYTE temp=m_dib.m_pdata[j*nw+i];m_hist[temp]++;}}//将修改的m_pdata的数据赋值给m_pDIBData,以显⽰修改的结果m_dib.UpdateData();m_bHist=true;//将修改的m_pdata的数据赋值给m_pDIBData,以显⽰修改的结果 m_dib.UpdateData(); //刷新屏幕Invalidate();}4、实验结果C++编程结果:。
图像处理中的直方图均衡化技术研究

图像处理中的直方图均衡化技术研究随着数字图像技术的不断发展,图像处理成为了现代科学技术中的一项重要技术。
而图像处理中的直方图均衡化技术是在数字图像处理技术中最基本的一个技术。
1. 直方图的理解图像的亮度是指图像中像素点的明亮度,即黑白灰色调的色度。
直方图则是将一个灰度级别的图像的像素点分为一个个亮度级别,然后计算每个亮度级别内像素点的数量。
每个亮度级别内的像素点数量就是这个图像的亮度分布状态。
2. 直方图均衡化技术的原理直方图均衡化就是将直方图的亮度分布向均匀分布的状态转化。
通过将原图像的灰度变换到一定的亮度范围内,使得直方图分配均匀,从而增强亮度对比度。
直方图均衡化是通过非线性函数完成的,使得灰度值的取值范围从原来的0 – 255变成了均衡化后的亮度范围,即新的0 – 255。
这样做就是为了提高灰度对比度,并且使得图像整体亮度看起来更加自然。
3. 直方图均衡化技术的应用直方图均衡化技术在图像处理中被广泛使用。
例如,在医学影像学中,可以使用直方图均衡化来增强图像中的对比度以便更好地识别病变;在遥感技术中,可以通过直方图均衡化技术来提高图像中相似物体的识别率;在数字图像处理中,可以使用直方图均衡化来增强图像的视觉效果,使图像更具有艺术效果。
4. 直方图均衡化技术的实现在数字图像处理技术中,实现直方图均衡化的方法有多种,其中最简单的方法是使用电脑的图像处理软件。
对于那些具备编程能力的人,可以使用Python等编程语言来实现直方图均衡化。
Python语言中,OpenCV是常用的图像处理库,它提供了许多图像处理算法和工具,其中就包括了直方图均衡化算法。
5. 直方图均衡化技术的局限性虽然直方图均衡化技术可以有效地提高图像的对比度和视觉效果,但是它也有一些局限性。
直方图均衡化往往会放大图像中的噪点,使得图像中的背景噪音扰动增加,从而影响图像的质量。
此外,直方图均衡化还存在一些应用限制,比如处理彩色图像的效果不如处理灰度图像的效果好,这就需要更进一步的改进方法。
图像处理中直方图均衡化的使用教程

图像处理中直方图均衡化的使用教程图像处理中的直方图均衡化是一种常用的增强图像对比度的方法。
通过对图像的像素值进行重新分布,直方图均衡化可以使图像中的明暗区域更具有对比度,从而提高图像的质量和清晰度。
本文将介绍直方图均衡化的原理、应用场景以及具体的步骤。
1. 直方图均衡化的原理直方图均衡化的原理基于对图像的灰度级进行重新分布。
它通过将原始图像的像素值映射到新的像素值上,使得直方图在整个灰度范围内得到均匀分布。
这样就能够增强图像中的低对比度区域,提高图像的视觉效果。
2. 直方图均衡化的应用场景直方图均衡化在图像处理领域有着广泛的应用。
下面列举了一些常见的应用场景:- 增强图像的对比度:直方图均衡化可以使得图像中的亮度值更加均匀分布,提高图像的对比度,使得图像变得更加清晰。
- 增强图像的细节:直方图均衡化通过增强图像中的低对比度区域,可以使得细节更加显著,提高图像的可视化效果。
- 降低图像的噪声:直方图均衡化可以将图像中的噪声分布均匀化,从而减少噪声对图像质量的影响。
3. 直方图均衡化的步骤下面是使用直方图均衡化对图像进行处理的具体步骤:步骤 1: 将彩色图像转换为灰度图像如果原始图像是彩色图像,我们需要将其转换为灰度图像。
这是因为直方图均衡化是针对灰度级进行处理的。
步骤 2: 计算原始图像的像素值分布使用图像处理工具,计算原始图像中每个像素值的出现频率。
这样可以得到一个直方图,该直方图显示了原始图像中像素值的分布情况。
步骤 3: 计算累积分布函数通过对原始图像的直方图进行累积求和,得到一个累积分布函数。
该函数显示了每个像素值的累积出现频率。
步骤 4: 计算新的像素值根据累积分布函数,计算每个像素值的新的映射像素值。
这个计算公式可以根据具体的图像处理工具而有所不同。
步骤 5: 创建均衡化后的图像使用新的像素值替换原始图像中的像素值,将得到的图像称为均衡化后的图像。
4. 注意事项在使用直方图均衡化时,需要考虑以下几个注意事项:- 直方图均衡化可能会改变图像的整体亮度。
数字图像处理实验报告直方图均衡化

数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(2+2)指导教师:陈华华实验日期:2012年5月24日直方图均衡化图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。
直方图均衡化是最常见的间接对比度增强方法。
直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
缺点:1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。
设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。
在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。
这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。
数字图像处理 实验 直方图均衡化实现图像增强

XXXXXXXX大学(数字图形处理)实验报告实验名称直方图均衡化实现图像增强实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:掌握直方图均衡化的原理。
掌握直方图均衡化实现图像增强的实现方法。
二、实验原理:直方图是统计像数统计图,如设一张灰度图或一个通道,值0~255。
直方图如果按。
255个区分的话。
统计出来的就是,值为。
0的有几个像数,值为1的有机个像数,这样的一张表。
那么均衡化的意思就是。
这样表要均衡。
不直不于。
0有上万个像数,1只有1 个。
正常,直方图本身可以用小于255个区。
比如10个,那么这样相对图中的点就有一个映射,这时值0-9统计落在第一个区,值为10-19落第二个区。
这样的结果就会出来,10个区,10个统计数区。
这时。
你均衡就是让10区的统计数据都不会差很多。
表现出来的就是一张图上的颜色分布相对均衡。
总的来说直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。
三、实验内容:利用直方图均衡化实现图像增强。
在资源编辑器中,在主菜单下添加一名为“直方图均衡化”的菜单步骤如前面实验。
实验代码如下:if(m_DibHead->biBitCount!=8){MessageBox("当前版本仅支持256色位图的操作!","系统提示!",MB_ICONINFORMA TION|MB_OK);return;}zftjh(m_Image,m_DibHead->biWidth,m_DibHead->biHeight);Invalidate();其中函数zftjh的实现代码如下:zftjh(unsigned char *lpDib,long lWidth,long lHeight){unsigned char *lpsrc;long lresult(0);long i,j;unsigned char bMap[256];long lCount[256];for(i=0;i<256;i++)lCount[i]=0;for(i=0;i<lHeight;i++)for(j=0;j<lWidth;j++){lpsrc=lpDib+i*lWidth+j;lCount[*lpsrc]++;}for(i=0;i<256;i++){lresult=0;for(j=0;j<=i;j++)lresult+=lCount[j];bMap[i]=(lresult*255)/lHeight/lWidth;}for(i=0;i<lHeight;i++)for(j=0;j<lWidth;j++){lpsrc=lpDib+i*lWidth+j;*lpsrc=bMap[*lpsrc];}}原图为下图的左边部分,均值化以后的图为右边的部分:。
数字图像处理中的直方图均衡化使用注意事项

数字图像处理中的直方图均衡化使用注意事项直方图均衡化是一种通过分布调整来改善图像对比度的方法。
它通过重新分布图像的像素值以增强其视觉效果。
在数字图像处理中,直方图均衡化是一项常用的技术,但在使用过程中需要注意以下几个方面。
首先,直方图均衡化可能会导致图像细节丢失的问题。
因为直方图均衡化会根据像素值的分布进行调整,从而扩展像素值的范围,使得亮度范围更广。
但这也可能导致低对比度区域的细节消失,从而影响图像细节。
因此,在进行直方图均衡化时,应该密切关注图像的细节信息,尽量避免过度调整图像的对比度。
其次,直方图均衡化可能引起噪声的增加。
在直方图均衡化的过程中,图像的亮度分布被调整,可能会增加图像的噪声。
这是因为噪声通常与图像的低亮度区域有关,当低亮度区域被调整时,噪声也可能被放大。
为了减少噪声的影响,可以在均衡化之前对图像进行去噪处理,或者采用自适应的直方图均衡化方法,以避免过度增加图像噪声。
另外,直方图均衡化也可能导致图像的颜色失真问题。
因为直方图均衡化是基于像素值的灰度分布进行调整,对彩色图像来说,它可能会改变图像的颜色分布,从而造成颜色失真。
为了避免这种情况,可以在进行直方图均衡化前将图像转换为HSV颜色空间,并只对亮度(Value)通道进行均衡化,这样可以避免颜色的偏移。
此外,直方图均衡化的效果可能受到图像的动态范围限制。
在某些情况下,图像的动态范围可能不足以支持完整的直方图均衡化。
比如,当图像的某些区域非常亮或非常暗时,直方图可能会在动态范围两端产生剧烈的波动,从而导致图像的细节丢失或噪声增加。
为了解决这个问题,可以采用自适应的直方图均衡化方法,以根据图像的局部动态范围来进行调整,减少对整体图像的影响。
最后,直方图均衡化的选择需要根据具体的应用需求来确定。
直方图均衡化可以改善图像的对比度,使图像更加清晰和易于处理。
但对于一些特定的图像处理任务,如目标检测、图像识别等,直方图均衡化可能并不适用。
图像处理:数字图像的灰度直方图均衡化

图像处理:数字图像的灰度直方图均衡化简介在数字图像处理中,灰度直方图均衡化是一种常用的图像增强技术。
它通过重新分配图像中各个灰度级的像素值,使得最终的灰度直方图呈现出更均匀分布的特点,从而提高图像的对比度和视觉效果。
原理灰度直方图是描述一幅图像中每个灰度级出现频次的统计直方图。
在灰度直方图均衡化过程中,首先需要计算原始图像的累积概率密度函数(CDF),然后利用CDF进行线性变换将原始像素值映射到新的像素值上。
这个线性变换可以通过以下公式表示:G' = (G_max - G_min) \times CDF(G) + G_min其中G'是新的像素值,G是原始的像素值,G_max和G_min分别为像素值范围最大和最小值,而CDF(G)则是原始图像中小于或等于G的累积概率密度函数。
实现步骤1.读取待处理的数字图像。
2.将彩色或多通道图转化为灰度图。
3.计算原始灰度图像的像素值的频次统计,得到原始灰度直方图。
4.计算原始灰度直方图的累积概率密度函数。
5.根据累积概率密度函数进行线性变换,将原始像素值映射到新的像素值上。
6.生成处理后得到的均衡化后的图像。
7.输出均衡化后的图像。
应用场景灰度直方图均衡化在许多领域都有广泛应用,例如医学影像分析、计算机视觉和数字摄影等。
其主要作用是增强图像对比度、改善细节和提升视觉效果。
同时,该技术也能够在一些特定场景下帮助识别和检测对象。
总结通过使用灰度直方图均衡化技术,可以使得数字图像中各个灰度级的像素值更加均匀分布,从而提高图像对比度和视觉效果。
这种方法在数字图像处理中具有广泛的应用,并且简单易实现。
然而,需要注意的是,在某些特定情况下,采用该方法可能会产生过度增强或引入噪声等问题,因此在实际应用中需要谨慎使用并结合其他处理方法进行综合处理。
(精品)数字图像处理实验报告--直方图规定化

数字图像处理实验报告直方图匹配规定化直方图均衡化能够自动增强整个图像的对比度,但它的具体增强效果不容易控制,处理的结果总是得到全局均匀化的直方图。
实际上有时需要变换直方图,使之成为某个特定的形状,从而有选择地增强某个灰度值范围内的对比度。
这时可以采用比较灵活的直方图规定化。
一般来说正确地选择规定化的函数可以获得比直方图均衡化更好的效果。
所谓直方图规定化,就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图。
所以,直方图修正的关键就是灰度映像函数。
直方图匹配方法主要有3个步骤(这里设M和N分别为原始图和规定图中的灰度级数,且只考虑N≤M的情况):(1) 如同均衡化方法中,对原始图的直方图进行灰度均衡化:(2) 规定需要的直方图,并计算能使规定的直方图均衡化的变换:(3) 将第1个步骤得到的变换反转过来,即将原始直方图对应映射到规定的直方图,也就是将所有pf(fi)对应到pu(uj)去。
一、A图直方图规定B图Matlab程序:%直方图规定化clear allA=imread('C:\Users\hp\Desktop\A.tif'); %读入A图像imshow(A) %显示出来title('输入的A图像')%绘制直方图[m,n]=size(A); %测量图像尺寸B=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255B(k+1)=length(find(A==k))/(m*n); %计算每级灰度出现的概率,将其存入B中相应位置endfigure,bar(0:255,B,'g'); %绘制直方图title('A图像直方图')xlabel('灰度值')ylabel('出现概率')axis([0,260,0,0.015])C=imread('C:\Users\hp\Desktop\B.tif');%读入B图像imshow(C) %显示出来title('输入的B图像')%绘制直方图[m,n]=size(C); %测量图像尺寸D=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255D(k+1)=length(find(C==k))/(m*n); %计算每级灰度出现的概率,将其存入D中相应位置endfigure,bar(0:255,D,'g'); %绘制直方图title('B图像直方图')xlabel('灰度值')ylabel('出现概率')axis([0,260,0,0.015])S1=zeros(1,256);for i=1:256for j=1:iS1(i)=D(j)+S1(i); %计算B灰度图累计直方图endendcounts=Bfigure,bar(0:255,counts,'r')title('A图像直方图 ')S2=zeros(1,256);for i=1:256for j=1:iS2(i)=counts(j)+S2(i);endend; %"累计"规定化直方图%对比直方图,找到相差最小的灰度级for i=1:256for j=1:255if S1(j)<=S2(i)&S1(j+1)>=S2(i)if abs(S1(j)-S2(i))<=abs(S1(j+1)-S2(i)) T(i)=j;else T(i)=j+1;endendendend%确定变换关系,重组直方图H=zeros(1,256);H(1)=S2(1);for i=2:255if T(i-1)>0for k=(T(i-1)+1):T(i)H(i)=H(i)+D(k);endelse H(i)=0;endendfigure,bar(0:255,H,'g') %显示规定化后的直方图title('A规定B后的直方图')xlabel('灰度值')ylabel('出现概率')axis([0,260,0,0.6])%显示规定图PA=C; %将各个像素归一化后的灰度值赋给这个像素for i=1:mfor j=1:nfor k=2:255if T(k-1)<=C(i,j)&C(i,j)<=T(k)PA(i,j)=k;break;endendendendfigure,imshow(PA) %显示规定化后的图像title('A规定B后图像')imwrite(PA,'guidinghua.bmp');二、用已知直方图规定A图规定灰度为[zeros(1,49),0.3,zeros(1,49),0.1,zeros(1,49),0.2,zeros(1,49),0.1,zeros(1,49 ),0.2,zeros(1,49),0.1]Matlab程序:clear allA=imread('C:\Users\hp\Desktop\B.tif'); %读入A图像imshow(A) %显示出来title('输入的A图像')%绘制直方图[m,n]=size(A); %测量图像尺寸B=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255B(k+1)=length(find(A==k))/(m*n); %计算每级灰度出现的概率,将其存入B中相应位置endfigure,bar(0:255,B,'g'); %绘制直方图title('A图像直方图')xlabel('灰度值')ylabel('出现概率')axis([0,260,0,0.015])S1=zeros(1,256);for i=1:256for j=1:iS1(i)=B(j)+S1(i); %计算原灰度图累计直方图endendcounts=[zeros(1,49),0.3,zeros(1,49),0.1,zeros(1,49),0.2,zeros(1,49),0.1,zer os(1,49),0.2,zeros(1,49),0.1];%规定化直方图figure,bar(1:300,counts,'r')title('规定化直方图')S2=zeros(1,256);for i=1:256for j=1:iS2(i)=counts(j)+S2(i);endend; %"累计"规定化直方图%对比直方图,找到相差最小的灰度级for i=1:256for j=1:256if S1(j)<=S2(i)&S1(j+1)>=S2(i)if abs(S1(j)-S2(i))<=abs(S1(j+1)-S2(i)) T(i)=j;else T(i)=j+1;endendendend%确定变换关系,重组直方图H=zeros(1,256);H(1)=S2(1);for i=2:256if T(i-1)>0for k=(T(i-1)+1):T(i)H(i)=H(i)+B(k);endelse H(i)=0;endendfigure,bar(0:255,H,'g') %显示规定化后的直方图title('规定化后的直方图')xlabel('灰度值')ylabel('出现概率')axis([0,260,0,0.6])%显示规定图PA=A; %将各个像素归一化后的灰度值赋给这个像素for i=1:mfor j=1:nfor k=2:256if T(k-1)<=A(i,j)&A(i,j)<=T(k)PA(i,j)=k;break;endendendendfigure,imshow(PA) %显示规定化后的图像title('规定化后图像')imwrite(PA,'guidinghua.bmp');。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理实验报告
实验名称:直方图均衡化
:
班级:
学号:
专业:电子信息工程(2+2)
指导教师:华华
实验日期:2012年5月24日
直方图均衡化
图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。
直方图均衡化是最常见的间接对比度增强方法。
直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度围的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度围的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
缺点:
1)变换后图像的灰度级减少,某些细节消失;
2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态围从而可达到增强图像整体对比度的效果。
设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。
在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):
(1)EQ(f)在0≤f≤L-1围是一个单值单增函数。
这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态围的一致性。
累积分布函数即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。
此时的直方图均衡化映射函数为: gk = EQ(fk) = (ni/n) = pf(fi) ,
(k=0,1,2,……,L-1)
上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。
在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出fk到gk的灰度映射关系。
在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对
源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。
一,调用matlab系统函数方式
(1)实验程序
clear all;
f=imread('cameraman.tif');
figure(1)
imshow(f);
figure(2)
imhist(f); %绘制图象f的直方图
ylim('auto');
g=histeq(f,256); %对f进行直方图均衡,输出图象的灰度级数为256
figure(3)
imshow(g);
figure(4)
imhist(g);
ylim('auto');
(2)实验结果:
图1:原图图2: 原图的直方图
图3:处理后的图图4: 处理后的直方图
二:不用系统函数
(1)实验程序:
f=imread('cameraman.tif'); %读取原图象
[m,n]=size(f);
figure(1)
imshow(f);
gp=zeros(1,256); %创建一个全零矩阵,1×256,计算各灰度出现的概率
for i=1:256
gp(i)=length(find(f == (i-1)))/(m*n);
end
figure,bar(0:255,gp);
newGp=zeros(1,256); %计算新的各灰度出现的概率
S1=zeros(1,256);
S2=zeros(1,256);
tmp=0;
for i=1:256
tmp=tmp+gp(i);
S1(i)=tmp; %各会灰度的累计概率
S2(i)=round(S1(i)*256); %将取整后的值存储在S2
end
for i=1:256
newGp(i)=sum(gp(find(S2==i)));
end
figure,bar(0:255,newGp);
for i=1:256
newGrayPic(find(f==(i-1)))=S2(i); %用新的灰度填充以前旧的灰度值
end
figure,imshow(newGrayPic);
(2)实验结果:
图5:原图图6: 原图的直方图
图7: 处理后的图图8: 处理后的直方图三:对比用这两种方式实现效果上的差异
调用系统函数的结果未调用系统函数的结果
尽管两者直方图的统计方式不同,左边是统计每个灰度值总的像素,右边是统计每个灰度值出现的概率,但形状基本相同。
I = imread('1.bmp');
J=imread('2.bmp');
Iq = imsubtract(I,J);%两幅图相减
imview(Iq)。