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

合集下载

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

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

数字图像处理实验报告直⽅图均衡化课程设计课程名称数字图像处理题⽬名称直⽅图均衡化学⽣学院信息⼯程学院专业班级 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. 直方图均衡化技术的局限性虽然直方图均衡化技术可以有效地提高图像的对比度和视觉效果,但是它也有一些局限性。

直方图均衡化往往会放大图像中的噪点,使得图像中的背景噪音扰动增加,从而影响图像的质量。

此外,直方图均衡化还存在一些应用限制,比如处理彩色图像的效果不如处理灰度图像的效果好,这就需要更进一步的改进方法。

直方图均衡化处理

直方图均衡化处理

数字图像处理实验报告姓名: 王程学号: 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];}}原图为下图的左边部分,均值化以后的图为右边的部分:。

C语言数字图像处理之直方图均衡化

C语言数字图像处理之直方图均衡化

C语⾔数字图像处理之直⽅图均衡化本⽂实例为⼤家分享了C语⾔直⽅图均衡化的具体代码,供⼤家参考,具体内容如下原理直⽅图均衡化(Histogram Equalization) ⼜称直⽅图平坦化,实质上是对图像进⾏⾮线性拉伸,重新分配图像象元值,使⼀定灰度范围内象元值的数量⼤致相等。

这样,原来直⽅图中间的峰顶部分对⽐度得到增强,⽽两侧的⾕底部分对⽐度降低,输出图像的直⽅图是⼀个较平的分段直⽅图:如果输出数据分段值较⼩的话,会产⽣粗略分类的视觉效果。

直⽅图是表⽰数字图像中每⼀灰度出现频率的统计关系。

直⽅图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对⽐度等概貌性描述。

灰度直⽅图是灰度级的函数, 反映的是图像中具有该灰度级像素的个数, 其横坐标是灰度级r, 纵坐标是该灰度级出现的频率( 即像素的个数) pr( r) , 整个坐标系描述的是图像灰度级的分布情况, 由此可以看出图像的灰度分布特性, 即若⼤部分像素集中在低灰度区域, 图像呈现暗的特性; 若像素集中在⾼灰度区域, 图像呈现亮的特性。

灰度数字图像是每个像素只有⼀个采样颜⾊的图像。

这类图像通常显⽰为从最暗⿊⾊到最亮的⽩⾊的灰度。

灰度图像与⿊⽩图像不同,在计算机图像领域中⿊⽩图像只有⿊⽩实现流程:1)统计每个灰度级像素点的个数2)计算灰度分布密度3)计算累计直⽅图分布4)累计分布取整,保存计算出来的灰度映射关系处理图⽚规格800*600 8位灰度单通道原图直⽅图均衡化分析:本次实验中,我故意把原图调暗,进⾏直⽅图均衡化后可以明显感受到整幅图像亮度增⼤了,⽽且某些细节⽅⾯更加突出。

出现问题最初进⾏直⽅图均衡化时,输出结果如下:经分析,是没有对数组初始化置零导致的。

Hist数组是进⾏⼀个统计像素点个数的数组,最初倘若不置零,结果必然毫⽆意义。

故⽽添加数组内存置零的操作:经测试,问题解决。

附代码#include <stdio.h>#include <stdlib.h>#include <memory.h>#define height 600#define width 800typedef unsigned char BYTE; // 定义BYTE类型,占1个字节int main(void){FILE *fp = NULL;//BYTE Pic[height][width];BYTE *ptr;BYTE **Pic = new BYTE *[height];for (int i = 0; i != height; ++i){Pic[i] = new BYTE[width];}fp = fopen("weiminglake_huidu.raw", "rb");ptr = (BYTE*)malloc(width * height * sizeof(BYTE));//创建内存for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){fread(ptr, 1, 1, fp);Pic[i][j] = *ptr; // 把图像输⼊到2维数组中,变成矩阵型式ptr++;}}fclose(fp);int hist[256];float fpHist[256];float eqHistTemp[256];int eqHist[256];int size = height *width;int i, j;memset(&hist, 0x00, sizeof(int) * 256);memset(&fpHist, 0x00, sizeof(float) * 256);memset(&eqHistTemp, 0x00, sizeof(float) * 256);for (i = 0; i < height; i++) //计算差分矩阵直⽅图直⽅图统计每个灰度级像素点的个数{for (j = 0; j < width; j++){unsigned char GrayIndex = Pic[i][j];hist[GrayIndex] ++;}}for (i = 0; i< 256; i++) // 计算灰度分布密度{fpHist[i] = (float)hist[i] / (float)size;}for (i = 0; i< 256; i++) // 计算累计直⽅图分布{if (i == 0){eqHistTemp[i] = fpHist[i];}else{eqHistTemp[i] = eqHistTemp[i - 1] + fpHist[i];}}//累计分布取整,保存计算出来的灰度映射关系for (i = 0; i< 256; i++){eqHist[i] = (int)(255.0 * eqHistTemp[i] + 0.5);}for (i = 0; i < height; i++) //进⾏灰度映射均衡化{for (j = 0; j < width; j++){unsigned char GrayIndex = Pic[i][j];Pic[i][j] = eqHist[GrayIndex];}}fp = fopen("output.raw", "wb");for (i = 0; i < height; i++){for (j = 0; j < width; j++){fwrite(&Pic[i][j], 1, 1, fp);}}fclose(fp);return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

图像处理:数字图像的灰度直方图均衡化

图像处理:数字图像的灰度直方图均衡化

图像处理:数字图像的灰度直方图均衡化简介在数字图像处理中,灰度直方图均衡化是一种常用的图像增强技术。

它通过重新分配图像中各个灰度级的像素值,使得最终的灰度直方图呈现出更均匀分布的特点,从而提高图像的对比度和视觉效果。

原理灰度直方图是描述一幅图像中每个灰度级出现频次的统计直方图。

在灰度直方图均衡化过程中,首先需要计算原始图像的累积概率密度函数(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');。

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

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

数字图像处理实验二直方图均衡化(直方图均衡化实质上是减少图象的灰度级以换取对比度的加大)例如:假设原图的灰度分布级为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实验报告_直方图及图像均衡化实现

自动点焊技术之数字图像处理实验报告实验名称:直方图均衡化增强实验编号:Proj03-02作者:珠海博泰科技莫工学号:20144309018实验日期:2014年11月30日摘要:本实验通过计算原始图像以及直方图均衡化后图像的直方图,验证书本中所述的通过直方图均衡化增强图像的原理、方法。

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

一幅数字图像中灰度级k r 出现的概率近似为 1,2,1,0,)(-⋅⋅⋅⋅⋅⋅==L k MNn r p k k r 式中MN 为图像中像素的总和,k n 是灰度为k r 的像素个数,L 是图像中可能的灰度级的数量。

在图像处理中特别重要的变换函数有如下形式dw w p L r T s rr )()1()(0⎰-== (1.1-1) 将式(1.1-1)离散化∑∑==-=-==kj j j kj r k k n MN L r p L r T s 001)()1()( k=0,1,2....,L-1 (1.1-2) 通过(1.1-2)式将输入图像中灰度级k r 的各像素映射到输出图像中灰度级为k s 的对应像素。

式(1.1-2)称为直方图均衡变换。

在实验中编写一个计算图像直方图的程序,验证书本中3.3.1节中讨论的直方图均衡化技术,求出均衡化曲线及均衡化直方图,最后均衡化后的直方图显示均衡化后的图像。

二、实验结果及讨论实验所产生的图片如下:讨论:式(1.1-2)具有展开输入图像直方图的趋势,均衡后的图像灰度级跨越更宽灰度级范围。

最终结果是增强了对比度。

附录实验中所用到的matlab程序在matlab通过命令输入图片ima=imread(‘Fig3.08(a).jpg’)cala(ima)以下M文件程序实现求出原始图像的直方图,变换曲线、变换后的直方图、均衡化后的图像显示。

function cala(imaga)%imaga为读入的原始图像矩阵数据,本实验为Fig3.08(a).jpg这幅图[m,n]=size(imaga); %计算出图像的像素大小HD=zeros(1,256); %图像灰度级为8位for k=0:255HD(k+1)=length(find(imaga==k))/(m*n); %计算每个灰度级的概率endfigure;subplot(1,2,1);imshow(imaga);title('原始图像')subplot(1,2,2);bar(0:255,HD,'g'); %绘制直方图title('原图像直方图');xlabel('灰度值');ylabel('灰度概率');%直方图均衡化计算AA=zeros(1,256);for i=1:256for j=1:iAA(i)=HD(j)+AA(i); %计算SkendendSS=round(AA*256); %将Sk归到相近级的灰度for i=1:2563bf(i)=sum(HD(find(SS==i))); %计算换算后每个灰度级的概率endfigure,bar(0:255,bf,'b'); %均衡化后的直方图title('均衡化后的直方图');ylabel('灰度概率');xlabel('灰度值');figure,plot(0:255,SS,'r') ; %显示灰度变化曲线legend('灰度变化曲线');ylabel('均衡化后灰度级');xlabel('原图像灰度级');%显示均衡化后的直方图PA=imaga;for i=0:255PA(find(imaga==i))=SS(i+1); %将各个像素归一化后的灰度值赋给这个像素endfigure,imshow(PA); %显示均衡化后的图像figure NO 6title('均衡化后图像');imwrite(PA,'result.bmp');。

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

【数字图像处理】直方图均衡化

【数字图像处理】直方图均衡化

【数字图像处理】直⽅图均衡化全局直⽅图均衡化直⽅图均衡化通过调整图像的直⽅图来增强图像的对⽐度,经常使⽤在医学图像分析中。

例如⼀幅8*8图像像素值如下:对各个像素值进⾏计数:得到累计概率分布:其中均衡化后的像素值计算公式为:前⾯的标题全局直⽅图均衡化,代表着直⽅图在整个图像计算,这样会有⼀个缺点,图像的部分区域会显得过暗或者过亮。

这个时候就需要使⽤⾃适应直⽅图均衡化(Adaptive histogram equalization)。

⾃适应直⽅图均衡化,⾸先将图像分为⼏个部分,然后对每个部分分别计算直⽅图进⾏均衡化,同时对边缘像素进⾏插值处理。

由图中可以看出⾃适应直⽅图均衡化对⾼亮区域的处理要⽐常规的直⽅图均衡化好的多。

1import os2from PIL import Image3from skimage import exposure4import numpy as np5import matplotlib.pyplot as plt678 img = Image.open('/home/vincent/Pictures/work/Unequalized_Hawkes_Bay_NZ.jpg')9 img = np.array(img)10 img_eq = exposure.equalize_hist(img)11 img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.04)1213 plt.figure(0)14 plt.imshow(img)15 plt.title('low contrast image')16 plt.figure(1)17 plt.imshow(img_eq)18 plt.title('high constrast image using normal histogram equalization')19 plt.figure(2)20 plt.imshow(img_adapteq)21 plt.title('high constract image using adaptive histogram euqalization')22 plt.show()。

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

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

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

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

熟悉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、线性变换、分段限行变换、指数变换、对数变换需要设置参数,参数设置的合理性对输出的图像有很大影响,很有可能因为参数设置不合理达不到预想的效果;而直方图的均衡化处理不需要设置参数,可以明显提高图像的视觉效果。

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

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

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

目的:曾强对比度目标:均匀分度原理:假设灰度级为归一化至范围[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');原图像原始直方图均衡直方图均衡后的图像:三、体会:通过本次设计,让我学会了从问题的高度来考虑设计的方方面面,对程序的设计和研究有了更深刻的体会;让我了解到程序的设计是建立在对理论知识了解的基础上的,特别是对直方图均衡化的原理要有较为详细的了解,此外对直方图均衡化算法也要进行了解;在编写程序时,进行模块化设计,以严谨的态度进行编程,避免出现低级错误。

数字图像处理之直方图均衡化

数字图像处理之直方图均衡化

数字图像处理之直⽅图均衡化直⽅图均衡化是图像处理领域中利⽤图像直⽅图对对⽐度进⾏调整的⽅法。

直⽅图均衡化要达到的效果:基本思想:把原始图的直⽅图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从⽽达到增强图像整体对⽐度的效果使⽤的⽅法是灰度级变换:s = T(r)原理:s=T(r) 0≤r≤1T(r)满⾜下列两个条件:(1)T(r)在区间0≤r≤1中为单值且单调递增(2)当0≤r≤1时,0≤T(r) ≤1条件(1)保证原图各灰度级在变换后仍保持从⿊到⽩(或从⽩到⿊)的排列次序条件(2)保证变换前后灰度值动态范围的⼀致性Pr(r)是r的概率密度函数,Ps(s)是s的概率密度函数,Pr(r)和T(r)已知,且T-1(s) 满⾜上述条件(1),所以有已知⼀种重要的变换函数:关于上限的定积分的导数就是该上限的积分值(莱布尼茨准则)对于离散值:其中r k 是第k个灰度级,k = 0,1,2,…,L-1. n k是图像中灰度级为r k的像素个数. n是图像中像素的总数.已知变换函数的离散形式为:sk称作直⽅图均衡化将输⼊图像中灰度级为rk(横坐标)的像素映射到输出图像中灰度级为sk (横坐标)的对应像素得到.实现代码:/******************************************************************************* 作⽤: 灰度均衡函数* 参数:* pixel 原始像素数组* tempPixel 保存变换后图像的像素数组* width 原始图像宽度******************************************************************************/void GrayEqualize(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height){// 灰度映射表BYTE map[256];long lCounts[256];memset(lCounts, 0, sizeof(long) * 256);// 计算各灰度值个数for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];lCounts[x]++;}// 保存运算中的临时值long lTemp;for (int i = 0; i < 256; i++){lTemp = 0;for (int j = 0; j <= i; j++)lTemp += lCounts[j];map[i] = (BYTE)(lTemp * 255.0f / width / height);}// 变换后的值直接在映射表中查找for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];tempPixel[i*4] = tempPixel[i*4+1] = tempPixel[i*4+2] = pixel[i * 4]; tempPixel[i*4+3] = 255;}}View Code彩⾊图直⽅图均衡化:更清晰:opencv代码:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace cv;using namespace std;int main( int argc, const char** argv ){Mat img = imread("MyPic.JPG", CV_LOAD_IMAGE_COLOR); //open and read the imageif (img.empty()) //if unsuccessful, exit the program{cout << "Image cannot be loaded..!!" << endl;return -1;}vector<Mat> channels;Mat img_hist_equalized;cvtColor(img, img_hist_equalized, CV_BGR2YCrCb); //change the color image from BGR to YCrCb formatsplit(img_hist_equalized,channels); //split the image into channelsequalizeHist(channels[0], channels[0]); //equalize histogram on the 1st channel (Y)merge(channels,img_hist_equalized); //merge 3 channels including the modified 1st channel into one imagecvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR); //change the color image from YCrCb to BGR format (to display image properly)//create windowsnamedWindow("Original Image", CV_WINDOW_AUTOSIZE);namedWindow("Histogram Equalized", CV_WINDOW_AUTOSIZE);//show the imageimshow("Original Image", img);imshow("Histogram Equalized", img_hist_equalized);waitKey(0); //wait for key pressdestroyAllWindows(); //destroy all open windowsreturn0;}View Code代码中使⽤的函数:New OpenCV functionscvtColor(img, img_hist_equalized, CV_BGR2YCrCb)This line converts the color space of BGR in 'img' to YCrCb color space and stores the resulting image in 'img_hist_equalized'.In the above example, I am going to equalize the histogram of color images. In this scenario, I have to equalize the histogram of the intensity component only, not the color components. So, BGR format cannot be used because its all three planes represent color components blue, green and red. So, I have to convert the original BGR color space to YCrCb color space because its 1st plane representsthe intensity of the image where as other planes represent the color components.void split(const Mat& m, vector<Mat>& mv )This function splits each channel of the 'm' multi-channel array into separate channels and stores them in a vector, referenced by 'mv'. Argument listconst Mat& m - Input multi-channel arrayvector<Mat>& mv - vector that stores the each channel of the input arrayequalizeHist(channels[0], channels[0]);Here we are only interested in the 1st channel (Y) because it represents the intensity information whereas other two channels (Cr and Cb) represent color components. So, we equalize the histogram of the 1st channel using OpenCV in-built function, 'equalizeHist(..)' and other two channels remain unchanged.void merge(const vector<Mat>& mv, OutputArray dst )This function does the reverse operation of the split function. It takes the vector of channels and create a single multi-channel array. Argument listconst vector<Mat>& mv - vector that holds several channels. All channels should have same size and same depthsOutputArray dst - stores the destination multi-channel arraycvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR)This line converts the image from YCrCb color space to BGR color space. It is essential to convert to BGR color space because 'imshow(..)' OpenCV function can only show images with that color space.This is the end of the explanation of new OpenCV functions, found in the above sample code. If you are not familiar with other OpenCV functions, please refer to the previous lessons.参考博客:http://opencv-srf.blogspot.jp/2013/08/histogram-equalization.html。

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

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

实验二报告一.实验内容:⑴直方图均衡化(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)。

数字图像处理实验报告
实验名称:直方图均衡化
姓名:
班级:
学号:
专业:电子信息工程(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)。

相关文档
最新文档