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

合集下载

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

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

数字图像处理实验报告直⽅图均衡化课程设计课程名称数字图像处理题⽬名称直⽅图均衡化学⽣学院信息⼯程学院专业班级 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++编程结果:。

直方图均衡化实验报告

直方图均衡化实验报告

多媒体技术实验报告项目名称: bmp文件直方图均衡
提交文档学生姓名:
提交文档学生学号:
教师评阅成绩:
教师评阅意见:
......................... .........................
1.提交报告时间: 2013年 11月16日
2.实验题目: bmp文件直方图均衡
3.实验要求:
1)读入给定BMP格式图像,
2)求输入图像的直方图, 并以文本文件形式输出
3)完成直方图均衡,
4)将直方图均衡后图像以BMP格式输出
5)计算均衡后图像的直方图, 并以文本文件形式输出
6)观察比较均衡前后图像及直方图的不同
4.实验环境: windows 7 操作系统、vc6.0
5.算法描述:
●程序流程图
●测试程序说明
1.用户需将欲测试文件放在该程序目录下
2.启动程序并输入bmp文件名即可,在该目录下的”resource”文件夹下可以看到运
行后的bmp图像以及在bmp图像均衡前后的直方图输出。

6.源程序清单:
●添加必要的注释
7.运行结果:
测试数据选择
测试结果分析
直方图均衡化前的直方图
直方图均衡化后的脂肪图
8.实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论)。

●收获
掌握了bmp文件的一些基本特性以及其存储结构, 此外还掌握了直方图均衡的作用与实现。

●特色
●操作简单, 效果良好
●不足
当测试的bmp图片数据很大时, 可能存在内存溢出的现象。

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

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

数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(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,这个条件保证了变换前后灰度值动态范围的一致性。

4.图像增强—直方图变换 - 数字图像处理实验报告

4.图像增强—直方图变换 - 数字图像处理实验报告

计算机与信息工程学院验证性实验报告一、实验目的1.掌握灰度直方图的概念及其计算方法;2.熟练掌握直力图均衡化和直方图规定化的计算过程;3.熟练掌握空域滤波中常用的平滑和锐化滤波器;4.掌握色彩直方图的概念和计算方法5.利用MATLAB程序进行图像增强。

二、实验原理图像增强是指按特定的需要突出一幅图像中的某些信息,同时,消弱或去除某些不需要的信息的处理方法。

其主要目的是处理后的图像对某些特定的应用比原来的图像更加有效。

图像增强技术主要有直方图修改处理、图像平滑化处理、图像尖锐化处理和彩色处理技术等。

本实验以直方图均衡化增强图像对比度的方法为主要内容,其他方法同学们可以在课后自行联系。

直方图是多种空间城处理技术的基础。

直方图操作能有效地用于图像增强。

除了提供有用的图像统计资料外,直方图固有的信息在其他图像处理应用中也是非常有用的,如图像压缩与分割。

直方图在软件中易于计算,也适用于商用硬件设备,因此,它们成为了实时图像处理的一个流行工具。

直方图是图像的最基本的统计特征,它反映的是图像的灰度值的分布情况。

直方图均衡化的目的是使图像在整个灰度值动态变化范围内的分布均匀化,改善图像的亮度分布状态,增强图像的视觉效果。

灰度直方图是图像预处理中涉及最广泛的基本概念之一。

图像的直方图事实上就是图像的亮度分布的概率密度函数,是一幅图像的所有象素集合的最基本的统计规律。

直方图反映了图像的明暗分布规律,可以通过图像变换进行直方图调整,获得较好的视觉效果。

直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。

下面给出直方图均衡化增强图像对比度的MATLAB程序:clc;clear allI=imread('Fig0308(a)(pollen).tif'); %读入原图像J=histeq(I); %对原图像进行直方图均衡化处理imshow(I); %显示原图像title('原图像'); %给原图像加标题名%对原图像进行屏幕控制;显示直方图均衡化后的图像figure;imshow(J);%给直方图均衡化后的图像加标题名title('直方图均衡化后的图像') ;%对直方图均衡化后图像进行屏幕控制;作一幅子图,并排两幅图的第1幅figure; subplot(1,2,1) ;imhist(I,64); %将原图像直方图显示为64级灰度title('原图像直方图') ; %给原图像直方图加标题名subplot(1,2,2); %作第2幅子图imhist(J,64) ; %将均衡化后图像的直方图显示为64级灰度title('均衡变换后的直方图') ; %给均衡化后图像直方图加标题名处理后的图像直方图分布更均匀了,图像在每个灰度级上都有像素点。

直方图均衡化处理

直方图均衡化处理

数字图像处理实验报告姓名: 王程学号: 2012021199037 日期:2013.3.30 一、实验要求(1)对一幅的对比度灰度图像进行直方图均衡化处理,画出处理前后的图像及直方图(2)用matlab读取和显示二、实验代码clc;clear;I=imread('E:\数字图像处理\exp2\伊伽贝拉.jpg'); %读入图像文件if isrgb(I)I=rgb2gray(I);endsubplot(221),imshow(I);title('原图像伊伽贝拉')[m,n]=size(I); %测量图像尺寸参数B=zeros(1,256); %预创建存放灰度出现概率的向量for i=1:mfor j=1:n%k=I(i,j);%k=k+1;%B(k)=B(k)+1;B(I(i,j)+1)=B(I(i,j)+1)+1; %计算每级灰度出现的概率endendsubplot(222),stem(0:255,B,'Marker','none'); %绘制直方图title('未均衡化的直方图');S=I;[m,n]=size(S); %读出图像的大小BP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255BP(k+1)=length(find(S==k))/(m*n); %计算每级灰度出现的概率endB1=zeros(1,256)for i=1:256for j=1:iB1(i)=BP(j)+B1(i);endendB2=round((B1*256)+0.5); for i=1:256BPeq(i)=sum(BP(find(B2==i))); end I=S;for i=0:255;I(find(S==i))=B2(i+1); %将各个像素归一化后的灰度值赋给这个像素 endsubplot(223),imshow(I); %显示均衡化后的图像title('均衡化后的图像'); subplot(224),imhist(I); %利用系统函数进行直方图计算title('均衡化后的直方图'); 三、 实验结果截图并做分析原图像伊伽贝拉01002003001234x 104未均衡化的直方图均衡化后的图像020004000均衡化后的直方图100200分析:从上面各个图中可以看出在原图像中的一些看不到或看不清楚的细节在均衡化后可以分辨出来,均衡化的图像变得更清晰。

数字图像处理 实验 直方图均衡化实现图像增强

数字图像处理 实验 直方图均衡化实现图像增强

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];}}原图为下图的左边部分,均值化以后的图为右边的部分:。

灰度直方图绘制及直方图均衡化

灰度直方图绘制及直方图均衡化

昆明理工大学(数字图像处理)实验报告 实验名称: 灰度直方图绘制及直方图均衡化 专 业: 电子信息科学与技术 姓 名: 学 号: 成 绩:[实验目的]1、加强对灰度直方图及直方图均衡化的理解。

2、掌握直方图均衡化方法。

[实验内容]1、编程实现图像的灰度直方图。

2、实现直方图均衡化。

[实验原理]灰度直方图:1、直方图概念:灰度直方图表示图像中每种灰度出现的频率。

2、直方图的作用: 反映一幅图像的灰度分布特性3、直方图的计算: nk 为图像中出现rk 级灰度的像素数,n 是图像像素总数,而 nk/n 即为频数。

直方图均衡化:1、算法思想:通过函数变换,对在图像中像素个数多的灰度 级进行展宽,而对像素个数少的灰度级进行缩减。

从而达 到清晰图像的目的。

2、变换后每一个r 都对应一个s ,变换函数须满足二个条件 :(1)T 单值单增函数。

(2)对 有 则有: [实验步骤]离散情况下的直方图均衡化的算法:1)、列出原始图像的灰度级2)、统计各灰度级的像素数目 10-≤≤L r 1)(0-≤≤L r T 10)(1-≤≤=-L s s T r 1,...2,1,010,)(-=≤≤=l k r Nn r P k k k3)、计算原始图像直方图各灰度级的频数4)、计算累积分布函数5)、计算映射后的输出图像的灰度级。

6)、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。

创建相应的菜单并建立相应的消息响应函数:添加一个灰度直方图显示框。

调出资源视图窗口,添加ID为IDD_DIALOG4的对话框资源,设计如图:创建对话框类CDialog_ZFT并按下表关联对应变量:资源类型资源ID 关联变量类型图片控件IDC_zft CStatic绘制文本框IDOK intvoid CDialog_ZFT::OnOK(){CWnd *pwnd=GetDlgItem(IDC_zft);CDC *mydc=pwnd->GetDC();for(int i=0;i<count;i++){mydc->MoveTo(i+10,220);mydc->LineTo(i+10,220-data[i]*180/m_fmax);}/**************直方图****************/void CDLView::OnZft(){// TODO: Add your command handler code here if(m_DibHead==NULL){MessageBox("请打开一幅图像");return;}long w,h;w=m_DibHead->biWidth;h=m_DibHead->biHeight;int i ,j;float h1[256],h2[256];float fmax=0.0;for(i=0;i<256;i++)h1[i]=0;for(i=0;i<h;i++){for(j=0;j<w;j++){h1[*(m_Image+i*w+j)]++;}}for(i=0;i<256;i++){h2[i]=h1[i]*1.0/w/h;if(fmax<h2[i])fmax=h2[i];}CDialog_ZFT zft;zft.data=h2;zft.count=256;zft.m_fmax=fmax;zft.DoModal();}/**************直方图均衡化***************/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];}}void CDLView::OnZftjunh(){// TODO: Add your command handler code hereif(m_DibHead->biBitCount!=8){MessageBox("当前版本仅支持256色位图的操作!","系统提示!",MB_ICONINFORMATION|MB_OK);return;}zftjh(m_Image,m_DibHead->biWidth,m_DibHead->biHeight);Invalidate();}[实验结果]原图均衡化后[实验总结]通过对比图像可知,变换后直方图趋向平坦,灰级减少,灰度合并。

统计图像直方图及图像均衡化

统计图像直方图及图像均衡化

数字图像处理实验报告一、实验内容:1、统计图像直方图2、直方图的均衡化二、实验目的:1、学会在VC环境下使用opencv,能学会基本的图像导入与显示2、学会加载图像及图像各像素点的统计3、理解并掌握利用直方图均衡化图像的过程,并用程序加以实现三、实验代码:#include "cv.h"#include "highgui.h"#include<stdio.h>#include<math.h>int main( int argc, char** argv ){IplImage* plmg; //声明IplImage指针int height,width,step,channels;uchar *data;int i,j,k,r,count=0;int r0[256]={0};float pr[256]={0},sk[256]={0};//载入图像plmg = cvLoadImage("Tulips.jpg", 1);{cvNamedWindow( "Image", 1 );//创建窗口cvShowImage( "Image", plmg );//显示图像//统计图像各参数并赋值height=plmg->height;width=plmg->width;step=plmg->widthStep;channels=plmg->nChannels;data=(uchar *)plmg->imageData;printf("Processing a %d*%d with %d channels\n",height,width,channels);//反转图像/* for(i=0;i<height;i++)for(j=0;j<width;j++)for(k=0;k<channels;k++)data[i*step+j*channels+k]=255-data[i*step+j*channels+k];cvNamedWindow( "Image1", 1 );//创建窗口cvShowImage( "Image1", plmg );//显示图像*/for(i=0;i<height;i++) //统计直方图for(j=0;j<width;j++)for(k=0;k<channels;k++)//for(r=0;r<256;r++)r0[data[i*step+j*channels+k]]++;for(r=0;r<256;r++)count=count+r0[r];for(r=0;r<256;r++)printf("pixel %d is %d\n",r,r0[r]);printf("all pixels=%d\n",count);for(r=0;r<256;r++){pr[r]=r0[r]/(float)count; //像素点归一化printf("pixel %d 的个数及归一化:%d %f\n",r,r0[r],pr[r]);}sk[0]=255*pr[0]; //均衡化像素函数for(r=1;r<256;r++)sk[r]=sk[r-1]+pr[r]*255;for(r=0;r<256;r++){printf("pixel %d befor equilibria is %d ,after is %f \n",r,r0[r],sk[r]);}//映射到原图像,即像素值强制修改为均衡后的值for(i=0;i<height;i++)for(j=0;j<width;j++)for(k=0;k<channels;k++)data[i*step+j*channels+k]=sk[data[i*step+j*channels+k]];cvNamedWindow( "Image1", 1 );//创建窗口cvShowImage( "Image1", plmg );//显示图像*/cvWaitKey(0); //等待按键cvDestroyWindow( "Image" );//销毁窗口cvReleaseImage( &plmg ); //释放图像return 0;}return -1;}四、实验结果:五、实验心得:1、每建立一个将要使用opencv的VC Project ,都需要给它指定需要的lib文件2、需要加载的图像必须和所建工程的程序文件在同一个目录下3、对图像操作时,必须先把定义的图像参数赋值,否则将不能对图像进行修改4、初步掌握了opencv在VC环境下的运行与基本的opencv语句5、图像均衡化时,要注意归一时是除以所有像素点的总数,均衡时概率依次累加后乘以的是最大灰度级,同时要注意所用数组整型和浮点型的转换6、实验误区:各灰度级经过像素点的计算得到均衡化的结果是灰度数,而不再是像素点的个数7、数组赋值需用{}。

数字图像处理实验二(直方图均衡化)

数字图像处理实验二(直方图均衡化)

数字图像处理实验二直方图均衡化(直方图均衡化实质上是减少图象的灰度级以换取对比度的加大)例如:假设原图的灰度分布级为126(最大为256,也就是从0到255的级上的灰度都有或多或少的出现),经过直方图均衡化后,灰度分布级别将会小于126。

编程的时候请按照直方图均衡化公式进行。

下面给出大致的编程思路和源代码:其中黑框部分需要自己编写源代码1)利用第一次实验课提供的dhc.h 和dhc.c文件以获取位图的高宽以及从文件头到实际的位图数据的偏移字节数,从而实现对位图实际数据的操作。

利用include命令#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h"思考问题:#include <*.h> 和#include "*.h"在程序运行中有什么差别?2)定义结构指针struct bmphdr *hdr;定义用于直方图变量unsigned char *bitmap, new_color[256];定义计算灰度分布,灰度累计分布的数组int count[256], acum[256];3)main()函数编写//定义整数i,j 用于函数循环时的,nr_pixels为图像中像素的个数int i, j, nr_pixels;//定义两个文件指针分别用于提取原图像的数据和生成直方图均衡化后的图像FILE *fp, *fpnew;//定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。

argc=3;argv[1]="test.bmp";argv[2]="testzf.bmp";//参数输入出错显示if (argc != 3) {printf("please input the name of input and out bitmap files\n");exit(1);}// 获取位图文件相关信息hdr = get_header(argv[1]);if (!hdr) exit(1);//以二进制可读方式打开输入位图文件fp = fopen(argv[1], "rb");if (!fp) {printf("File open error!\n");exit(1);}// 文件指针指向数据区域fseek(fp, hdr->offset, SEEK_SET);//计算位图像素的个数nr_pixels = hdr->width * hdr->height;bitmap = malloc(nr_pixels);//读取位图数据到bitmap中fread(bitmap, nr_pixels, 1, fp);fclose(fp);memset(count, 0, sizeof(count));//计算每个灰度级上像素的个数结果存入count[]数组中memcpy(acum, count, sizeof(acum));//计算灰度的累计分布for (i = 1; i < 256; i++)acum[i] += acum[i-1];//灰度直方图的均衡化(核心程序部分,请仔细分析)为了方便大家编程实现,这里直接给出了源代码,本实验最核心的部分就在这里//}//对所有的像素灰度值按照均衡化得到的灰度对应规则进行转换,结果存入bitmap[]中//fpnew = fopen(argv[2], "wb+");//由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:fwrite(hdr->signature, 2, 1, fpnew);fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew);fwrite(&hdr->offset, 4, 1, fpnew);fwrite(&hdr->hdr_size, 4, 1, fpnew);fwrite(&hdr->width, 4, 1, fpnew);fwrite(&hdr->height, 4, 1, fpnew);fwrite(&hdr->nr_planes, 2, 1, fpnew);fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);fwrite(&hdr->compress_type, 4, 1, fpnew);fwrite(&hdr->data_size, 4, 1, fpnew);fwrite(&hdr->resol_hori, 4, 1, fpnew);fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew);fwrite(&hdr->important_color, 4, 1, fpnew);if (hdr->offset > 54)fwrite(hdr->info, (hdr->offset - 54), 1, fpnew);////关闭fclose(fpnew);//释放内存(优化程序必需)free(hdr);free(bitmap);return 0;}。

数字图像处理实验报告(matlab)

数字图像处理实验报告(matlab)

学院:自动化学院班级:电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.数字图像直方图均衡化之后直方图为什么不是绝对平坦的?答:直方图均衡化是将一已知灰度概率密度分布的图像,经过某种变换,变成一幅具有均匀灰度概率密度分布的新图像。

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

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

实验一数字图像处理编程实习(设计性实验)一、实验名称:数字图像处理编程实验一之灰度直方图统计与均衡化。

二、实验目的和要求:本设计性实验专为印刷工程专业的《数字图像处理》课程设计。

熟悉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. 图像获取与预处理:选择一张高对比度的彩色图像作为实验对象,通过图像处理软件将其转换为灰度图像。

确保图像的亮度范围适中,避免过亮或过暗的情况。

2. 直方图均衡化算法:实现直方图均衡化算法的代码,可以使用Python等编程语言。

算法的核心思想是将原始图像的像素值映射到新的像素值,使得新图像的直方图均匀分布在整个灰度范围内。

3. 实验结果展示:将经过直方图均衡化处理后的图像与原始图像进行对比展示。

通过观察图像的对比度、亮度和细节等方面的变化,评估直方图均衡化算法的效果。

实验结果与分析:经过直方图均衡化处理后,图像的对比度明显增强,细节更加清晰可见。

原本过亮或过暗的区域得到了适当的修正,使得整个图像的亮度分布更加均匀。

同时,图像中的细节也得到了突出,使得观察者能够更好地识别和分析图像中的内容。

在实际应用中,直方图均衡化可以用于图像增强、目标检测、图像匹配等领域。

例如,在安防监控系统中,直方图均衡化可以提高图像的对比度,使得目标物体更加明显,有利于目标检测和识别。

在医学图像处理中,直方图均衡化可以增强图像的细节,有助于医生对病灶的判断和诊断。

然而,直方图均衡化也存在一些局限性。

首先,直方图均衡化是一种全局操作,对整个图像进行处理,可能会导致某些局部细节的损失。

其次,直方图均衡化对于亮度变化较大的图像效果较差,可能会导致过度亮化或过度暗化的问题。

因此,在实际应用中,需要根据具体情况选择合适的图像处理方法。

结论:通过本次实验,我们验证了直方图均衡化在图像处理中的有效性。

直方图均衡化可以增强图像的对比度和细节,使得图像更加清晰明亮。

然而,直方图均衡化也存在一些局限性,需要根据具体情况选择合适的图像处理方法。

数字图像处理实验报告直接灰度变换和直方图均衡

数字图像处理实验报告直接灰度变换和直方图均衡

实验二:直接灰度变换和直方图均衡一、代码线性变换:LinearTransformFunc.m分段线性变换:StretchFunc.m对数变化:LogFunc.m指数变换:ExponentFunc.mLinearTransformFunc.mfunction [new]= LinearTransformFunc( original, k, d )new=original;m=size(original,1);n=size(original,2);for i=1:mfor j=1:nnew(i,j)=original(i,j)*k+d;endendnew=original*k+d;endStretchFunc.mfunction [ new ] = StretchFunc(original, x1,y1,x2,y2)new = original;w = size(new, 1);h = size(new, 2);k1 = y1 / x1;dk1 = (y2 - y1) / (x2 - x1);dk2 = (255 - y2) / (255 - x2);for i = 1 : wfor j = 1 : hx = new(i, j);if x < x1new(i, j) = k1 * x;elseif x < x2new(i, j) = dk1 * (x - x1) + y1;elsenew(i, j) = dk2 * (x - x2) + y2;endendendLogFunc.mfunction [new] = LogFunc(original,c)new=original;m=size(original,1);n=size(original,2);for i=1:mfor j=1:nnew(i,j)=c*log(double(original(i,j))+1);endendnew=c*log(double(original)+1);endExponentFunc.mfunction [new] = ExponentFunc(original,c,d)new=original;m=size(original,1);n=size(original,2);for i=1:mfor j=1:nnew(i,j)=c*original(i,j).^d;endendnew=c*original.^d;end命令行窗口调用上述.m文件:i=imread('C:\Users\Administrator\Desktop\shiyanyi.png'); i_gray=rgb2gray(i);I=double(i_gray)/255;I_LinearTransform=LinearTransformFunc(I, 1, 0.01);imshow(I_LinearTransform);I_Stretch=StretchFunc(I,0.01,0.03,0.4,0.5); imshow(I_Stretch);I_Log=LogFunc(I,1.5);imshow(I_Log);I_Exponent=ExponentFunc(I,1.1,2); imshow(I_Exponent);I1=imadjust(I,[],[0 1]);imhist(I);imhist(I1);I_junhenghua=histeq(I);imshow(I)imshow(I_junhenghua)输出图像以及直方图如下:(原图)(线性变换)(分段线性变换)(对数变换)(指数变换)(均衡化)(直方图)实验总结:1、用imadjust函数将原图像的灰度值调整到[0 1],调整后图片并没有改变,直方图也没有改变;2、图像归一化处理后设置的参数大小不同,归一化后参数设置需要很小,以避免超出所显示的范围后出现空白现象;3、线性变换、分段限行变换、指数变换、对数变换需要设置参数,参数设置的合理性对输出的图像有很大影响,很有可能因为参数设置不合理达不到预想的效果;而直方图的均衡化处理不需要设置参数,可以明显提高图像的视觉效果。

直方图均衡实验报告

直方图均衡实验报告

数字图像处理实验报告实验二图像直方图均衡姓名:*******学号:*********专业:************一.实验目的学习并掌握图像直方图均衡的基本理论,并通过分析均衡前后的图像验证课堂教学内容,总结直方图均衡的特点。

二.实验内容对图像 img2 进行直方图均衡(img2为X光片图像)1.对比均衡前后图像的直方图及特点,①图形显示其直方图以及灰度映射关系②计算以下参数:概率非零灰度数,概率非零灰度中最大概率、最小概率、最大最小概率之比。

③统计图像中概率大于平均概率的灰度级数;④计算非零概率的平均值和方差⑤您认为哪些参数能够表现图像直方图分布的均匀程度?试提取相关参数进行测试。

2.找一到两幅图像重复上述实验。

3.通过实验结果对比,能得出什么结论?三、实验报告要求1.源程序(C或Matlab):(1).画直方图的Matlab程序filname='E:\课件\大三下\图像处理\实验二\1.bmp'; //打开文件A=imread(filname); //读取文件信息imhist(A); //画出图像文件的直方图(2)C程序#include<stdio.h>#include<windows.h>#include<string.h>#include<math.h>BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;typedef struct PP{unsigned char GRAY;}PIXEL;////画出灰度映射关系图////void draw(double s[]){FILE *fout,*fin;int i,j;PIXEL p[256][256];BITMAPFILEHEADER m_bfh;BITMAPINFOHEADER m_bih;RGBQUAD colorPanel[256];fin=fopen("1.bmp","rb");fread(&m_bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&m_bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);fclose(fin);fout=fopen("Gray mapping relationship.bmp","wb");m_bih.biWidth=256;m_bih.biHeight=256;m_bih.biSizeImage=256*256;m_bfh.bfSize=m_bfh.bfOffBits+m_bih.biSizeImage;for(i=0;i<256;i++)for(j=0;j<256;j++) p[i][j].GRAY=255;for(i=0;i<256;i++){j=(int)s[i];p[i][j].GRAY=0;}fwrite(&m_bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&m_bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);fwrite(p,256*256,1,fout);fclose(fout);}////统计概率非零灰度数子函数 ///double nonzero(double p[])int i;double sum=0;for(i=0;i<256;i++)if(p[i]!=0) sum=sum+1;printf("概率非零灰度数:%.2f\n",sum);return sum;}////找到最大概率子函数////double lmax(double p[]){int i;double max;for(i=0;i<256;i++) //对max初始化if(p[i]!=0){max=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]>max) max=p[i]; //找出概率非零最大值printf("概率非零最大值:%lf\n",max);return max;}////找到最小概率子函数////double lmin(double p[]){int i;double min;for(i=0;i<256;i++) //对min初始化if(p[i]!=0){min=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]<min) min=p[i]; //找出概率非零最小值printf("概率非零最小值:%lf\n",min);return min;}////求最大最小概率之比子函数////double rate(double max,double min){double r;r=max/min;printf("最大最小概率之比:%lf\n",r);return r;}////统计图像中概率大于平均概率的灰度级数子函数 //// double lager(double p[]){int i;double sum=0;for(i=0;i<256;i++)if(p[i]>1.0/256) sum=sum+1;printf("图像中概率大于平均概率的灰度级数:%lf\n",sum);return sum;}////求非零概率的平均值的子函数////double average(double sum){double aver;aver=1.0/sum;printf("非零概率的平均值:%lf\n",aver);return aver;}////求非零概率的方差的子函数////double variance(double sum,double p[],double aver){int i;double asum=0,var;for(i=0;i<256;i++)if(p[i]!=0) asum=asum+pow((p[i]-aver),2);//printf("%lf\n",asum);var=asum/sum;printf("非零概率的方差:%lf\n",var);return var;}/////主函数//////int main(){FILE *fin,*fout;RGBQUAD colorPanel[256];PIXEL **bmpData;long i,j;double num[256]={0},p[256]={0},s[256]={0};double max,min,r,sum=0,asum=0,aver,psum=0,var;fin=fopen("1.bmp","rb");fread(&bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);bmpData=(PIXEL **)malloc(bih.biHeight*sizeof(PIXEL *));for(i=0;i<bih.biHeight;i++){bmpData[i]=(PIXEL *)malloc(bih.biWidth*sizeof(PIXEL));fread(bmpData[i],bih.biWidth,sizeof(PIXEL),fin);}fclose(fin);////对图像进行直方图均衡////for(i=0;i<bih.biHeight;i++){ //二重循环遍历图象数据for(j=0;j<bih.biWidth;j++){num[bmpData[i][j].GRAY]++; //当前灰度级象素/总象素}}for(i=0;i<256;i++)p[i]=num[i]/bih.biWidth/bih.biHeight; //计算灰度概率s[0]=p[0];for(i=1;i<256;i++){s[i]=s[i-1]+p[i]; //计算累积概率(低灰度概率加到高灰度概率上)}for(i=0;i<256;i++){ //0~1映射到0~255s[i]=s[i]*255;for(j=0;j<256;j++){if(s[i]>=j-0.5&&s[i]<j+0.5)s[i]=j;}}for(i=0;i<bih.biHeight;i++){ //对原图像进行直方图均衡for(j=0;j<bih.biWidth;j++){bmpData[i][j].GRAY=(unsignedchar)s[bmpData[i][j].GRAY];}}////计算各个参数////sum=nonzero(p); //概率非零灰度数max=lmax(p); //概率非零灰度中最大概率min=lmin(p); //概率非零灰度中最小概率r=rate(max,min); //最大最小概率之比asum=lager(p); //图像中概率大于平均概率的灰度级数aver=average(sum); //非零概率的平均值var=variance(sum,p,aver); //非零概率的方差draw(s); //画灰度映射关系曲线fout=fopen("3.bmp","wb");fwrite(&bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);for(i=0;i<bih.biHeight;i++)fwrite(bmpData[i],bih.biWidth,sizeof(PIXEL),fout);fclose(fout);return 0;}2.程序流程图:3.实验结果图像及对应参数:(1)图一:均衡前:均衡前直方图:灰度映射:对应参数:均衡后:均衡后的直方图:对应参数:均衡前后灰度映射关系:横轴表示均衡前的灰度,纵轴表示均衡后的灰度。

图像增强的实验报告

图像增强的实验报告

图像增强的实验报告图像增强的实验报告引言:图像增强是数字图像处理领域中的一项重要任务。

通过改善图像的质量和清晰度,图像增强可以使我们更好地观察和分析图像中的细节。

本实验旨在探索图像增强的不同方法,并评估它们在不同场景下的效果。

实验设计:为了比较不同的图像增强方法,我们选择了一组具有不同特征的图像作为实验对象。

这些图像包括自然风景、人像和低对比度图像。

我们将使用以下三种方法进行图像增强:直方图均衡化、自适应直方图均衡化和增强对比度自适应拉伸。

实验步骤:1. 直方图均衡化:直方图均衡化是一种常用的图像增强方法,它通过重新分布图像的像素值来增强对比度。

我们首先将图像转换为灰度图像,然后计算灰度直方图。

接下来,我们使用累积分布函数对直方图进行均衡化,使得图像中的像素值分布更加均匀。

最后,我们将均衡化后的图像转换回原始图像的颜色空间。

2. 自适应直方图均衡化:直方图均衡化在某些情况下可能会导致图像的局部细节丢失。

为了解决这个问题,我们使用自适应直方图均衡化方法。

在这种方法中,我们将图像分成许多小区域,并对每个区域的直方图进行均衡化。

通过这种方式,我们可以保留图像的局部特征,并增强整体对比度。

3. 增强对比度自适应拉伸:增强对比度自适应拉伸是一种简单而有效的图像增强方法。

它通过将图像的像素值映射到一个更大的范围来增强对比度。

我们首先计算图像的平均亮度和标准差,然后使用以下公式对图像进行拉伸:enhanced_pixel = (pixel - mean) * (max_stretch / std) + mean其中,pixel是原始图像中的像素值,mean是图像的平均亮度,std是图像的标准差,max_stretch是拉伸的最大范围。

实验结果:我们将三种图像增强方法应用于不同类型的图像,并进行了对比分析。

结果显示,直方图均衡化方法在某些情况下可以显著增强图像的对比度,特别是对于低对比度图像。

然而,它可能会导致图像的噪声增加和细节丢失。

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

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

数字图像报告班级:姓名:学号:一、直方图均衡:直方图均衡化也叫做直方图平坦化,是一种常用的灰度增强算法。

目的:曾强对比度目标:均匀分度原理:假设灰度级为归一化至范围[0,1]内的连续量,并令Pr (r)表示某给定图像中的灰度级的概率密度函数(PDF),其下标用来区分输入图像和输出图像的PDF。

假设我们对输入灰度级执行如下变换,得到(处理后的)输出灰度级s:S=T(r)=∫0r Pr(w)dw式中w 是积分的哑变量。

可以看出,输出灰度级的概率密度函数是均匀的,即a.当0≤s≤1 时,Ps(s)=1b.当s 为其他时,Ps(s)=0换言之,前述变换生成一幅图像,该图像的灰度级较为均衡化,且覆盖了整个范围[0,1]。

灰度级均衡化处理的最终结果是一幅扩展了动态范围的图像,它具有较高的对比度。

该变换函数只不过是一个累积分布函数(CDF)。

二、直方图均衡程序:clc主程序:picture=input('please input the filename:','s');fid=fopen(picture);dat=fread(fid);d=dat';B=reshape(d,256,256);h=length(d);newname=input('输入新的文件名:','s');zhi(h,newname,B,d);子程序:function y=zhi(h,newname,B,d)figure(1);imshow(uint8(B'));N=zeros(1,256);for i=0:255for j=1:hif i==d(j)N(i+1)=N(i+1)+1;endendendi=0:255;p=N/h;figure(2)stem(i,p,'.')title('原始直方图')m=zeros(1,256);for k=1:256if k==1m(k)=p(k);elsem(k)=m(k-1)+p(k);endendfor k=1:256r=round(m*255);ends=zeros(1,256);for a=1:256for b=1:256if r(a)==r(b)s(a)=N(a)+N(b);endendendq=s/h;for j=1:256k(j)=r(j);endfigure(3);stem(k,q,'.');title('均衡直方图');M=zeros(1,h);for i=1:hk=d(i);M(i)=r(k+1);endR=reshape(M,256,256);figure(4);imshow(uint8(R'));jht=fopen(newname,'wb');g=fwrite(jht,M);fclose('all');原图像原始直方图均衡直方图均衡后的图像:三、体会:通过本次设计,让我学会了从问题的高度来考虑设计的方方面面,对程序的设计和研究有了更深刻的体会;让我了解到程序的设计是建立在对理论知识了解的基础上的,特别是对直方图均衡化的原理要有较为详细的了解,此外对直方图均衡化算法也要进行了解;在编写程序时,进行模块化设计,以严谨的态度进行编程,避免出现低级错误。

数字图像处理实验报告(直方图均衡化、直方图匹配)

数字图像处理实验报告(直方图均衡化、直方图匹配)

实验二报告一.实验内容:⑴直方图均衡化(Histogram equalization),⑵直方图匹配(Histogram matching),二.实验结果:1.将mountain.jpg图像文件读入Matlab,对其作直方图均衡化,结果如下:2、对mountain.jpg图像做直方图匹配运算3、利用mountain.jpg图像的直方图(imhist函数可生成),编写直方图均衡化函数。

function [ imeq ] = Fhisteq( space,h )%FHISTEQ 此处显示有关此函数的摘要% 此处显示详细说明% 原始图像space 必须是[0 1]之间的%直方图均衡化函数L=length(h);pdf=h/numel(space);cdf=cumsum(pdf);f=zeros(1,L);for i=1:Lf(i)=cdf(i)*255;end[dimx,dimy]=size(space);imeq=zeros(dimx,dimy);for i=1:dimxfor j=1:dimyimeq(i,j)=f(round(space(i,j)*255)+1);endendend结果如下:4、直方图均衡化分析:直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。

它的主要思想是扩展图像原有灰度级分布,使图像能够在更大的灰度级范围内分布,从而提高了对比度和灰度色调的变化,使图像更加清晰。

从上面的图像可以清楚的看到原有的mountain图像整体偏暗,直方图集中在灰度级偏小的一侧。

但是直方图均衡化后每个灰度级上的图像点数量有了明显提高,直方图中间部分的数值也有了明显的增强,图像的视觉效果也明显变好了。

而使用直方图匹配的算法则能够更好的让原有图像朝着我们预期的直方图分布去变换,这对于有特定的显示要求来说是一种比较好的选择。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计课程名称数字图像处理题目名称直方图均衡化学生学院信息工程学院专业班级 10级电信2班学号学生姓名指导教师曹江中2013年 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 、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。

5、主要代码///////////////////////////////////////////////////////////////////画两个直方图坐标轴/////////////////////////////////////////////////////////////////// void CImageView::OnDraw(CDC* pDC){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 j f ]5.0)()[(min min max ++-=g f C g g INT g i nn r p k k =)(1,,2,1,010-=≤≤l k r kCImageDoc* 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(); 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();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(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);str.Format("原图直方图归一化");pDC->TextOut(100, nh+230+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_yuantu[i]>max)max=m_yuantu[i];for(i=0;i<256;i++){pDC->MoveTo(10+i,nh+200);pDC->LineTo(10+i,nh+200-(m_yuantu[i]*160/max));}}/******************///TEST 第二个直方图if(m_bHist==true){//绘画直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 绘制坐标轴pDC->MoveTo(160+nw,nh+20); //(10,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(160+nw,nh+200);//(10,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(460+nw,nh+200);//(310,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(415, nh+200+10, str);str.Format("50");pDC->TextOut(465, nh+200+10, str);str.Format("100");pDC->TextOut(515, nh+200+10, str);str.Format("150");pDC->TextOut(565, nh+200+10, str);str.Format("200");pDC->TextOut(615, nh+200+10, str);str.Format("255");pDC->TextOut(670, nh+200+10, str);str.Format("直方图均衡化后归一化");pDC->TextOut(505, nh+230+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 420, nh+200-2);pDC->LineTo(i + 415, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 420, nh+200-2);pDC->LineTo(i + 420, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(710,nh+200-5);pDC->LineTo(715,nh+200);pDC->LineTo(710,nh+200+5);// 绘制y轴箭头pDC->MoveTo(415,nh+20);pDC->LineTo(410,nh+20+5);pDC->MoveTo(415,nh+20);pDC->LineTo(420,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(415+i,nh+200);pDC->LineTo(415+i,nh+200-(m_hist[i]*160/max));}}/*************/// 显示图像(具体的参数见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);}}/////////////////////////////////////////////////////////////////////直方图均衡化及直方图归一化坐标轴赋值程序///////////////////////////////////////////////////////////////////// void CImageView::OnZhifangtu(){//判断图像是否打开,没打开,则弹出提示框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox("图像还打开,请先打开图像!");return;}//获取图像宽和高及定义成员变量int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j;int *arr=new int [nw*nh];int n[256]={0};float p[256]={0.0},c[256]={0.0};BYTE* pdata=m_dib.m_pdata;for(i=0;i<256;i++) //初始化直方图数组m_yuantu[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;j<nh;j++)for(i=0;i<nw;i++){BYTE temp=pdata[j*nw+i];m_yuantu[temp]++;}}m_bHist=true;//直方图归一化计算for(i=0;i<nh;i++){for(j=0;j<nw;j++){n[m_dib.m_pdata[i*nw+j]]++;}}for(i=0;i<256;i++){(float)p[i]=(float)n[i]/(float)(nw*nh); }//归一化后累计计算for(i=0;i<256;i++){for(j=0;j<=i;j++){c[i]+=p[j];}}//找到灰度值最大值最小值int max=m_dib.m_pdata[0],min=m_dib.m_pdata[0]; for(i=0;i<nh;i++){for(j=0;j<nw;j++){if(max<m_dib.m_pdata[i*nw+j]){max=m_dib.m_pdata[i*nw+j];}else if(min>m_dib.m_pdata[i*nw+j]){min=m_dib.m_pdata[i*nw+j];}}}//套公式直方图均衡化计算赋值给arr[]一维数组for(i=0;i<nh;i++){for(j=0;j<nw;j++){arr[i*nw+j]=int(c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5); }}//一维数组arr[]赋值给新图像for( j=0;j<nh;j++){for(i=0;i<nw;i++){m_dib.m_pdata[j*nw+i]=arr[j*nw+i];}}//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData();//刷新屏幕Invalidate();for(i=0;i<256;i++) //初始化直方图数组m_hist[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;j<nh;j++)for(i=0;i<nw;i++){BYTE temp=pdata[j*nw+i];m_hist[temp]++;}}m_bHist=true;// TODO: Add your command handler code here}6、实验结果。

相关文档
最新文档