《数字图像处理(实验部分)》实验3点运算(直方图均衡化)
- 格式:doc
- 大小:137.01 KB
- 文档页数:3
数字图像处理实验报告直⽅图均衡化课程设计课程名称数字图像处理题⽬名称直⽅图均衡化学⽣学院信息⼯程学院专业班级 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、掌握图像直方图均衡化处理的方法。
二、实验原理及内容图像增强的目的是,对一幅给定的图像,突出一些有用的信息,抑制一些无用的信息,提高图像的使用价值。
常用的图像增强方法有:灰度修正法、平滑、几何校正、图像锐化、频域增强、维纳滤波、卡尔曼滤波等。
Matlab图像处理工具箱中的函数imadjust实现上述对比度调整算法。
函数实现:J=imadjust(I,[low high],[bottom top],gamma) Matlab函数实现:(1)求图像的灰度直方图Imhist ( I,n )(2)求灰度的等值图Imcontour ( I,n )(3)直方图均衡化J=histeq (I, hgram )实验内容:1、显示图像“bacteria.tif”的灰度直方图和灰度等值图;2、对给定图像“pout.tif”进行灰度变换、增强对比度,显示增强前、后的图像以及它们的灰度直方图;3、对给定图像“pout.tif”进行直方图均衡处理,显示处理前、后的图像以及它们的灰度直方图;三、实验报告要求1、给出求图像“bacteria.tif”的灰度直方图和灰度等值图的Matlab程序,并显示图像的灰度直方图和灰度等值图的;2、给出对图像“pout.tif”进行灰度变换、增强对比度的Matlab程序,显示增强前、后的图像以及它们的灰度直方图;对结果进行分析。
3、给出对图像“pout.tif”进行直方图均衡处理的Matlab程序,显示处理前、后的图像以及它们的灰度直方图;对结果进行分析。
四、实验程序及框图1.实验1实验框图实验程序clear all %清空工作空间I=imread('bacteria.tif'); %读入图像subplot(2,2,1);imshow(I);xlabel('原图') %显示原图subplot(1,2,2);imhist(I,128);xlabel('灰度直方图') %显示灰度直方图subplot(2,2,3);imcontour(I,8);xlabel('灰度等值图') %显示灰度等值图2.实验2 实验框图实验程序clear all; %清空工作空间I=imread('pout.tif'); %读入图像J=imadjust(I,[0.3 0.7],[ ]); %增强对比度subplot(2,2,1);imshow(I);xlabel('原图像'); %显示原图像subplot(2,2,2);imhist(I);xlabel('原图像直方图'); %显示原图像直方图subplot(2,2,3);imshow(J);xlabel('对比度增强后图像'); %显示对比度增强图像subplot('2,2,4');imhist(J);xlabel('增强图像直方图') %显示增强后图像直方图3.实验3实验框图实验程序clear all; %清空工作空间I=imread('pout.tif'); %读入图像J=histeq(I); %直方图均衡化subplot(2,2,1),imshow(I);xlabel('原图') %显示原图subplot(2,2,2),imhist(I);xlabel('原图灰度直方图') %显示原图灰度直方图subplot(2,2,3),imshow(J);xlabel('处理后图像') %显示处理后图像subplot(2,2,4),imhist(J)xlabel('处理后图像灰度直方图') %显示处理后图像直方图五、思考题1、为什么一般情况下对离散图像进行均衡化并不能产生完全平坦的直方图?答:因为映射后的图像不能取到所有灰度级,变换后的直方图会有某些灰度级空缺,故不能产生完全平坦的直方图。
数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(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,这个条件保证了变换前后灰度值动态范围的一致性。
实验三图像直方图与均衡化一、实验原理离散图像用直方图表示该图像中各个不同灰度级像素出现的相对频率。
灰度直方图是简单且实用的工具,对图像的采集、处理和分析都可以有效地利用直方图。
灰度直方图反映了数字图像中的每一灰度级与其出现的频率间的关系。
直方图均衡化是通过对原图形进行某种变换,使图像的直方图变为均匀分布的直方图,从而达到增强的效果。
二、实验设备MATLAB软件三、实现程序:pic=imread('football.jpg');imshow(pic)imwrite(rgb2gray(PS),'football.bmp');pic=rgb2gray(pic);figure,imshow(pic)[m,n]=size(pic);S0=zeros(1,256);for k=0:255S0(k+1)=length(find(pic==k))/(m*n);endfigure,bar(0:255,S0,'g')S1=zeros(1,256);for i=1:256for j=1:iS1(i)=S0(j)+S1(i);endendS2=round(S1*256);for i=1:256S0eq(i)=sum(S0(find(S2==i)));endfigure,bar(0:255,S0eq,'b')Img=pic;for i=0:255Img (find(pic==i))=S2(i+1);endfigure,imshow(Img);四、运行结果:原图像的直方图均衡化后图像的直方图原图像均衡化后的图像。
Timg(原图) im_1(MATLAB均衡处理) im_2(ps均衡处理)原图的rgb直方图r通道直方图(原图)g通道直方图(原图)b通道直方图(原图)r通道直方图(im_1)g通道直方图(im_1)b通道直方图(im_1)r通道直方图(im_2)g通道直方图(im_2)b通道直方图(im_2)这里找到了一张对比度较低的图像timg,其原本的对比度很低。
之后分别用MATLAB和ps对其进行了直方图均衡,生成了im_1与im_2,可见其处理的效果是有区别的。
MATLAB处理的结果色彩更加艳丽但是相对于原图来说其每个区域的颜色和旁边的区域颜色差别会很巨大,就是使得边界更明显,同时对比度提高了很多。
而ps处理的结果可以看出新的直方图和原直方图相比产生了很多形状上的差别,可见ps的直方图均衡采用了更为复杂的算法。
同时图像对比度以及颜色艳丽的程度得到了提升,但是没有MATLAB处理的效果明显,保持了原图的色调以及部分颜色关系。
Ps中直方图均衡可以一键实现,因此在此不做重点描写,我们来看如何用MATLAB实现这种操作。
MATLAB代码如下:主程序:im=imread('timg.jpg');im_r=change(im(:,:,1));im_g=change(im(:,:,2));im_b=change(im(:,:,3));im1(:,:,1)=im_r;im1(:,:,2)=im_g;im1(:,:,3)=im_b;figure;imshow(im1);imwrite(im1,'im1.jpg');Change函数:function [n] = change(m)n=m;sum=0;for i=0:255for j=1:407for k=1:500if(m(j,k)==i)sum=sum+1;endendendchan=sum/(407*500);chan1=fix(chan*255+0.5);for j=1:407for k=1:500if(m(j,k)==i)n(j,k)=chan1;endendendend[x,xout] = hist(n(:), 0:255);figure;bar(xout, x); xlim([0 255]);MATLAB其实本身有实现直方图均衡效果的函数,这里为了理解算法自己做了这个函数。
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];}}原图为下图的左边部分,均值化以后的图为右边的部分:。
作业3:直方图均衡1.选取一张对比度不明显的彩色图像,编写MATLAB代码对RGB通道独立地进行直方图均衡,同时用PHOTOSHOP软件对其进行均衡,比较两种处理方法在效果上的差异。
使用R/G/B=image(:,:,1/2/3);提取图像的三个通道,imshow(R);显示三个通道的图像,imhist(R);显示对应颜色分量的直方图,r=histeq(R);分别对三个通道进行直方图均衡化,equated = cat(3,r,g,b);联合RGB三个数组,得到均衡化后的图像。
原图与matlab直方图均衡化后的图像原图的RGB分量均衡后的RGB分量在photoshop中处理图像后得到下图的结果。
Ps中得到的图像RGB通道独立直方图均衡得到的图像比较:选取的原图是逆光拍摄,颜色很暗,暗部细节很多。
经过matlab处理后,灰度级部分合并,灰度级较低的间隔变大,灰度级较高的间隔变小。
但对真彩色图像的直方图均衡化时,通过单纯地对RGB三个分量图像分别均衡、合并, 会使均衡后的图像出现轻微的色彩失真现象, 而且原图中灰度级较高的地方的细节部分缺失。
但是经过ps处理后的图像,原本灰度值较低的地方明显变亮,同时原本灰度值较高的地方仍然很好保留了,并没有出现matlab处理后的问题。
Ps处理后的图像色彩也很正常,没有出现失真的问题。
数字图像直方图的算法步骤:①列出原始图像的灰度级f j,j=0,1,…,L-1,②统计各灰度级的像素数目n j,j=0,1,…,L-1,③计算原始图像直方图各灰度级的频数p(f j)= n j/N,j=0,1,…,L-1,④计算累计分布函数C(j)=Σp(f k), j=0,1,…,L-1,⑤g i= INT[(g max-g min)C(f)+g min+0.5]2.阅读"Exact Hitogram Specification"这篇英文文献第二部分和第三部分,结合压缩包中MATLAB源代码,理解精确直方图均衡的算法原理,重点是借助空间滤波实现像素排序的算法原理,用(1)中图片,比较精确直方图均衡和PHOTOSHOP均衡的效果差异。
学院:自动化学院班级:电081班姓名:***学号:********2011年10月实验一直方图均衡化一、实验目的:1. 熟悉图像数据在计算机中的存储方式;2. 掌握图像直方图均衡化这一基本处理过程。
二、实验条件:PC微机一台和MATLAB软件。
三、实验内容:1.读入图像数据到内存中,并显示读入的图像;2.实现直方图均衡化处理,显示处理前后图像的直方图。
3.显示并保存处理结果。
四、实验步骤:1.打开Matlab编程环境;2.获取实验用图像。
用’imread’函数将图像读入Matlab;用’imshow’函数显示读入的图像。
3.获取输入图像的直方图:用’imhist’函数处理图像。
4.均衡化处理:用’histeq’函数处理图像即可。
5.获取均衡化后的直方图并显示图像:用’imhist’和’imshow’函数。
6.保存实验结果:用’imwrite’函数处理。
五、实验程序及结果:1、实验程序subplot(6,2,1);i=imread('test1-1.jpg');imhist(i);title('test1-1 hist');subplot(6,2,2);i=im2double(i);imshow(i);title('test1-1 Ô-ͼÏñ');subplot(6,2,3);s=histeq(i);imhist(s);title('test1-1 balancedhist');subplot(6,2,4);imshow(s);title('test1-1 ¾ùºâ»¯ºóµÄͼÏñ');subplot(6,2,5);i=imread('test1-2.jpg');imhist(i);title('test1-2 hist');subplot(6,2,6);i=im2double(i);imshow(i);title('test1-2 Ô-ͼÏñ');subplot(6,2,7);s=histeq(i);imhist(s);title('test1-2 balancedhist'); subplot(6,2,8);imshow(s);title('test1-2 ¾ùºâ»¯ºóµÄͼÏñ');subplot(6,2,9);i=imread('test1-3.jpg');imhist(i);title('test1-3 hist');subplot(6,2,10);i=im2double(i);imshow(i);title('test1-3 Ô-ͼÏñ');subplot(6,2,11);s=histeq(i);imhist(s);title('test1-3 balancedhist'); subplot(6,2,12);imshow(s);title('test1-3 ¾ùºâ»¯ºóµÄͼÏñ');2、实验结果test1-1 hist050100150200250test1-1 原图像test1-1 balancedhist00.10.20.30.40.50.60.70.80.91test1-1 均衡化后的图像test1-2 hist050100150200250test1-2 原图像test1-2 balancedhist00.10.20.30.40.50.60.70.80.91test1-2 均衡化后的图像0test1-3 hist050100150200250test1-3 原图像test1-3 balancedhist00.10.20.30.40.50.60.70.80.91test1-3 均衡化后的图像六、实验思考1.数字图像直方图均衡化之后直方图为什么不是绝对平坦的?答:直方图均衡化是将一已知灰度概率密度分布的图像,经过某种变换,变成一幅具有均匀灰度概率密度分布的新图像。
实验报告课程名称数字图像处理实验项目点运算和直方图处理实验仪器 PC机 MATLAB软件系别专业班级/学号学生姓名实验日期成绩指导老师实验1 点运算和直方图处理一、实验目的1. 掌握利用Matlab图像工具箱显示直方图的方法2. 掌握运用点操作进行图像处理的基本原理。
3. 进一步理解利用点操作这一方法进行图像处理的特点。
4. 掌握利用Matlab图像工具箱进行直方图均衡化的基本方法。
二、实验的硬件、软件平台硬件:计算机软件: MATLAB三、实验内容及步骤1. 了解Matlab图像工具箱的使用。
2. 利用Matlab图像工具箱对图像进行点操作,要求完成下列3个题目中的至少2个。
⑴图1灰度范围偏小,且灰度偏低,改正之。
⑵图2暗处细节分辨不清,使其能看清楚。
⑶图3亮处细节分辨不清,使其能看清楚。
图1 图2 图33. 给出处理前后图像的直方图。
4. 利用MatLab图像处理工具箱中函数对以上图像进行直方图均衡化操作,观察结果。
四、思考题1. 点操作能完成哪些图像增强功能?2. 直方图均衡化后直方图为何并不平坦?为何灰度级会减少?五、实验报告要求1.对点操作的原理进行说明。
2.给出程序清单和注释。
3.对处理过程和结果进行分析(包括对处理前后图像的直方图的分析)。
题目1%图1灰度范围偏小,且灰度偏低,改正之。
方法:像素点操作clcclear allclose allI=imread('Image1.png'); %读取标题为“Point2”的位图,并用“I”表示该图j=rgb2gray(I); %转为灰度图像,并用j表示[l,r]=size(j); %将j的行数返回到第一个输出变量l,将列数返回到第二个输出变量rfigure(1); %创建一个空的窗口subplot(221); %将窗口分成2行2列,并在第一个位置进行操作imshow(j); %显示图片jtitle('原图像'); %标题for m=1:l %循环语句,行数m的值从1到l,下同for n=1:rp(m,n)=j(m,n)*1.8; %将j图中的每一个点的像素值乘以一个常数,得到的新像素以原来的位置构成图pendendsubplot(222);imshow(p);title('处理后图像') ;subplot(2,2,3) ;imhist(j); %显示图像j的直方图title('原图像直方图');subplot(2,2,4);imhist(p);title('处理后图像直方图');输出的图像:图4对比图像处理前后的直方图可知,原图的灰度范围较小。
实验一数字图像处理编程实习(设计性实验)一、实验名称:数字图像处理编程实验一之灰度直方图统计与均衡化。
二、实验目的和要求:本设计性实验专为印刷工程专业的《数字图像处理》课程设计。
熟悉Matlab与Visual C++编程环境,实现对输入图像进行灰度直方图均衡化处理。
通过本实验教学环节,可以使学生对图像文件格式、图像文件的读写、图像处理程序的基本结构、处理方式和编程基本方法有进一步的认识,获得对图像处理原理和编程方法的进一步认识。
实验的基本要求是:利用Matlab或Visual C++编程环境编制图像处理程序,对一幅灰度图像进行灰度直方图统计与均衡化处理。
三、实验基本内容:1.图像处理程序用户界面设计;2.灰度直方图统计与均衡化;四、实验设备及环境:1.计算机;2.Matlab与Visual C++编程环境。
五、实验原理:1、数字图像直方图均衡化处理原理:A)图像直方图统计:根据图像的灰度等级统计该灰度等级的象素个数;B)图像直方图均衡化:直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。
具体为:1)统计图像直方图;2)计算归一化的累计直方图;3)计算均衡后的直方图sk=int[(N-1)tk+0.5];4)根据均衡后的直方图将图像的每一个像素都映射到新的直方图上;六、实验具体要求:1.用户界面设计:用户界面可以自由设计,但应包括如下物件:窗体、菜单或命令按钮、图像显示框。
程序功能:图像像素行列数输入、打开图像、图像灰度直方图统计、图像灰度直方图均衡化、图像存储、退出。
七、对程序和实验报告的要求:1.将编制完成的Matlab或Visual C++程序作为附件交给实习老师;2.实验报告:所要求具有下列内容:图像处理程序编制的总体方案;程序用户界面的设计思路;图像处理算法;遇到的问题和解决过程;结果分析。
八、附件:附:实习示例程序:%《数字图像处理》课程实习%图像文件直方图统计显示实验程序by 武汉大学印刷与包装系易尧华I=imread('C:\Documents and Settings\hapxqpy\桌面\test-yy.bmp'); %将图像文件testimage.bmp的数据读入并赋值给变量I;figure(1); %新建用于图像显示的窗口;imshow(I); %在窗口中显示图像;figure(2); %新建用于图像直方图的窗口;imhist(I); %在窗口中显示图像直方图;J=histeq(I); %图像直方图均衡化处理;figure(3); %新建用于图像直方图的窗口;imshow(J); %在窗口中显示均衡化后的图像;figure(4); %新建用于显示均衡化后的图像直方图;imhist(J); %在窗口中显示均衡化后图像直方图;。
《数字图像处理(实验部分)》教案
实验三:点运算(直方图均衡化)
1.实验目的
1.掌握MATLAB 的基本操作。
2.了解数字图像处理在MATLAB中的基本处理过程。
3.学习点运算的原理,观察算法处理结果
2.实验设备
2.1.PC 兼容机一台;操作系统为WindowsWindowsXP。
2.2.数字图像处理开发环境:MATLAB软件
3.实验原理
直方图均衡化的算法原理
4.实验步骤
.1 打开MA TLAB开发环境
.2点击MA TLAB窗口上File菜单,选择New-〉M—File,在弹出的Edit编辑器内输入如下程序:
%I=imread('pout.tif'); % 读取MA TLAB自带的potu.tif图像
I=imread('IMG0050A.jpg'); % 可改为读取MATLAB自带的potu.tif图像
I=rgb2gray(I);
figure(1);
subplot(2,3,1),imshow(I);title('原图');
subplot(2,3,2),imhist(I);
[J,T]=histeq(I,256); % 图像灰度扩展到0~255,有256个灰度级
subplot(2,3,3),imshow(J);title('均衡1图');
subplot(2,3,4),imhist(J);
%figure,plot((0:255)/255,T); % 转移函数的变换曲线
J=histeq(I,32);% 图像灰度扩展到0~255,但是只有32个灰度级
subplot(2,3,5),imshow(J); title('均衡2图');
subplot(2,3,6),imhist(J);
.3将该程序保存,并点击工具栏中Run 按钮,程序会自动运行,并显示出结果。
广 .4 观察处理结果
5. 实验结果 01002000
01002000
0100200
均衡2后图
6.问题与思考
总结MATLAB开发环境在使用上的特点,掌握其在实验中使用方法。
改变程序中的某些参数,重新运行程序,观察会是什么结果。