图像工程概论实验报告——二值化直方图均衡化
数字图像处理实验报告直方图均衡化
数字图像处理实验报告直⽅图均衡化课程设计课程名称数字图像处理题⽬名称直⽅图均衡化学⽣学院信息⼯程学院专业班级 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++编程结果:。
图像直方图均衡实验
/*初始化直方图背景为白色*/CvScalar white;white.val[0]=255;for(int i=0;i<dst->height;i++){for(int j=0;j<dst->width;j++){cvSet2D(dst, i, j, white);}}/*绘制横竖坐标*/CvScalar black;black.val[0] = 0;for(int i=0;i<280;i++){cvSet2D(dst, 280, i+10, black);}for(int i=0;i<280;i++){cvSet2D(dst, i+10, 20, black);}/*绘制直方图*/for(int i=0;i<256;i++){int high = count[i]*256/max;int x=20+i;for(int j=0;j<high;j++){int y=280-j;cvSet2D(dst, y, x, black);}}return dst;}实验结果如下图所示:2.通过计算归一化直方图,设计算法实现直方图均衡化处理。
核心代码如下:IplImage* Equalization(IplImage *src){IplImage* dst = cvCreateImage(cvGetSize(src),3.在灰度图像直方图均衡处理的基础上实现彩色直方图均衡处理。
核心代码如下:IplImage* ColorEqualization(IplImage *src){IplImage *dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);IplImage *pImageChannel[3] = {NULL};int i;for (i=0; i<3; i++) {pImageChannel[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);}cvSplit(src, pImageChannel[0], pImageChannel[1], pImageChannel[2], NULL);for (i=0; i<src->nChannels; i++) {pImageChannel[i] = Equalization(pImageChannel[i]);}/*三通道合并*/cvMerge(pImageChannel[0], pImageChannel[1], pImageChannel[2], NULL, dst);return dst;}实验结果如下图所示:。
数字图像处理实验报告直方图均衡化
数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(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,这个条件保证了变换前后灰度值动态范围的一致性。
直方图均衡化实验报告
医学图像处理实验报告实验名称:直方图均衡化实验姓名:gao jun qiang 学号:20105405班级:生医1001指导教师:……2013年6月5日一、 实验目的1、编程实现下列功能:读出存储的黑白灰度图象并显示,显示灰度直方图,对图象进行直方图均衡化处理,显示处理后图象及直方图,画出灰度变换曲线,并存储处理后图象。
二、 实验原理直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化是一种自动调节图象对比度质量的算法,使用的方法是灰度级变换:s = T(r) 。
它的基本思想是通过灰度级r 的概率密度函数p(rk ),求出灰度级变换T(r).灰度直方图的计算十分简单,依据定义在离散形式下有下面的公式成立:()1,1,0,-==L k n n k p k Λ (1) 公式中:k n 为图像中出现k s 级灰度的像素数,n 是图像像素总数,而n nk 即为频数。
计算累积直方图各项:()1,1,0,00-===∑∑==L k i p n n t k i ki i k Λ (2) 取整扩展:]5.0)1int[(+-=k k t L t (3)映射对应关系 :k t k ⇒三、实验代码及结果直方图均衡化实验代码:clc;close all;clear all;Imag = imread('lena.tiff');figure()imshow(Imag),title('原图像');ImagGray = rgb2gray(Imag);figure()imshow(ImagGray),title('灰度图像');[r,c] = size(ImagGray);%统计灰度直方图GrayPixNum = zeros(1,255);for i = 1:rfor j = 1:cGrayPixNum(1,ImagGray(i,j)) = GrayPixNum(1,ImagGray(i,j))+1;endend%对灰度直方图进行归一化GrayPixPro = GrayPixNum./(r*c);figure()plot(GrayPixPro),title('图像直方图');%-----------------------------------------------------------% -----------------------直方图均衡化------------------------%-----------------------------------------------------------%直方图累加GrayAdd = zeros(1,255);GrayAdd(1,1) = GrayPixPro(1,1);for i = 2:255GrayAdd(1,i) = GrayAdd(1,i-1)+GrayPixPro(1,i);endNewGray = round(GrayAdd.*254.+0.5);NewGrayPro = zeros(1,255);for i = 1:255GrayTemp = NewGray(1,i);NewGrayPro(1,GrayTemp) = NewGrayPro(1,GrayTemp)+GrayPixPro(1,i); endfigure()plot(NewGrayPro.*(r*c)),title('均衡化直方图');%有均衡化直方图和映射关系得到均衡化的图像NewImag = zeros(r,c);for i =1:rfor j = 1:cNewImag(i,j) = NewGray(1,ImagGray(i,j));endendNewImag = uint8(NewImag);figure()imshow(NewImag),title('均衡化的图像');figure()plot(NewGray),title('灰度变换曲线');实验结果:图1 原灰度图像图2 原图像的灰度直方图图3 经过直方图均衡化后的灰度图片图4 均衡化后的直方图图5 灰度变化曲线三、实验思考从上述实验结果可以看出,经过直方图均衡化后的图片的对比度更高,且边缘效果更高。
直方图均衡化实验报告
南京信息工程大学实验(实习)报告实验(实习)名称点操作及直方图均衡化实验(实习)日期得分指导教师系计算机系专业软件工程年级三班次 3 姓名学号实验目的:1、理解点操作图像增强方法2、理解直方图均衡化算法的原理,掌握算法的实现实验内容:1、理解图像灰度拉伸,练习imadjust函数的使用;I=imread('pout.tif');K=imadjust(I,[0.2 0.5],[0 1]); figure;subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(K);2、编程实现图像线性灰度变换算法;(全域截取分段 for循环)clear ;clc; I=imread('pout.tif');I=double(I);J=(I-80)*255/70;row=size(I,1);column=size(I,2);for i=1:rowfor j=1:columnif J(i, j)<0J(i,j)=0;endif J(i,j)>255;J(i,j)=255;endendendfigure;subplot(121); imshow(uint8(I)); subplot(122); imshow(uint8(J)); subplot(223),imhist(I);subplot(224),imhist(J);3、编程实现图像二值化算法;直方图选域值clear;clc;i=imread('pout.tif');bw=im2bw(i);subplot(121),imshow(i),subplot(122),imshow(bw);4、编程实现图像灰度对数log变换、指数(三角符号)变换算法;I=imread('pout.tif');J=log(im2double(I)+1);K=fft2(J);n=5;D0=0.1*pi;rh=0.7;rl=0.4;[row, column]=size(J);for i=1:rowfor j=1:columnD1(i,j)=sqrt(i^2+j^2);H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n)));endendL=K.*H;M=ifft2(L); N=exp(M)-1;figure;subplot(121),imshow(I); subplot(122),imshow(real(N));5、在Matlab中编程实现直方图均衡化算法(不使用histeq函数,编程实现其功能)。
图像处理报告
1.原理
直方图均衡化是图像处理领域中利用图像直方图对比度进行图像增强的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。(代码见附件1)
b.中值滤波器
中值滤波是一种最常用的非线性平滑滤波器,其滤波原理是把邻域中的图像的像素按灰度级进行排序,然后选择该组的中间值作为输出像素值。
1.原理
其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值来替换,其主要功能是让周围像素灰度值差别比较大的像素改取与周围的像素值接近的值,从而可以消除孤立的噪声点,所以中值滤波对于滤除图像的椒盐噪声非常有效。常规中值滤波器对长拖尾概率分布的噪声能起到良好的平滑效果。不仅如此,它在消除噪声的同时还具有保护边界信息的优点,对图像中的某些细节起到保护作用,因而在图像去噪处理中得到了比较广泛的应用。但是常规中值滤波去脉冲噪声的性能受滤波窗口尺寸的影响较大,而且它在抑制图像噪声和保护细节两方面存在一定的矛盾:取的滤波窗口越小,就可较好地保护图像中某些细节,但滤除噪声的能力会受到限制;反之,取的滤波窗口越大就可加强噪声抑制能力,但对细节的保护能力会减弱。(代码见附件3)
另外,拉普拉斯算子还可以表示成模板的形式,如图3-1所示。图3-1(a)表示离散拉普拉斯算子的模板,图3-1(b)表示其扩展模板,从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。(代码见附件4)
图像灰度变换、二值化、直方图
图像灰度变换、⼆值化、直⽅图1、灰度变换1)灰度图的线性变换Gnew = Fa * Gold + Fb。
Fa为斜线的斜率,Fb为y轴上的截距。
Fa>1 输出图像的对⽐度变⼤,否则变⼩。
Fa=1 Fb≠0时,图像的灰度上移或下移,效果为图像变亮或变暗。
Fa=-1,Fb=255时,发⽣图像反转。
注意:线性变换会出现亮度饱和⽽丢失细节。
2)对数变换t=c * log(1+s)c为变换尺度,s为源灰度,t为变换后的灰度。
对数变换⾃变量低时曲线斜率⾼,⾃变量⼤时斜率⼩。
所以会放⼤图像较暗的部分,压缩较亮的部分。
3)伽马变换y=(x+esp)γ,x与y的范围是[0,1], esp为补偿系数,γ为伽马系数。
当伽马系数⼤于1时,图像⾼灰度区域得到增强。
当伽马系数⼩于1时,图像低灰度区域得到增强。
当伽马系数等于1时,图像线性变换。
4)图像取反⽅法1:直接取反imgPath = 'E:\opencv_pic\src_pic\pic2.bmp';img1 = imread(imgPath); % 前景图img0 = 255-img1; % 取反景图subplot(1,2,1),imshow(img1),title('原始图像');subplot(1,2,2),imshow(img0),title('取反图像');⽅法2:伽马变换Matlab:imadjust(f, [low_in, high_in], [low_out, high_out], gamma)[low_in, high_in]范围内的数据映射到 [low_out, high_out],低于low的映射到low_out, ⾼于high的映射到high_out. imgPath = 'E:\opencv_pic\src_pic\pic2.bmp';img1 = imread(imgPath); % 前景图img0 = imadjust(img1, [0,1], [1,0]);subplot(1,2,1),imshow(img1),title('原始图像');subplot(1,2,2),imshow(img0),title('取反图像');2、⼆值化1)rgb2gray⼀般保存的灰度图是24位的灰度,如果改为8bit灰度图。
数字图像处理实验二(直方图均衡化)
数字图像处理实验二直方图均衡化(直方图均衡化实质上是减少图象的灰度级以换取对比度的加大)例如:假设原图的灰度分布级为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;}。
直方图均衡化实验报告
直方图均衡化实验报告直方图均衡化实验报告引言:直方图均衡化是一种常用的图像处理技术,它可以增强图像的对比度和细节,使得图像更加清晰明亮。
本实验旨在通过实际操作验证直方图均衡化的效果,并探讨其在不同场景下的应用。
实验步骤:1. 图像获取与预处理:选择一张高对比度的彩色图像作为实验对象,通过图像处理软件将其转换为灰度图像。
确保图像的亮度范围适中,避免过亮或过暗的情况。
2. 直方图均衡化算法:实现直方图均衡化算法的代码,可以使用Python等编程语言。
算法的核心思想是将原始图像的像素值映射到新的像素值,使得新图像的直方图均匀分布在整个灰度范围内。
3. 实验结果展示:将经过直方图均衡化处理后的图像与原始图像进行对比展示。
通过观察图像的对比度、亮度和细节等方面的变化,评估直方图均衡化算法的效果。
实验结果与分析:经过直方图均衡化处理后,图像的对比度明显增强,细节更加清晰可见。
原本过亮或过暗的区域得到了适当的修正,使得整个图像的亮度分布更加均匀。
同时,图像中的细节也得到了突出,使得观察者能够更好地识别和分析图像中的内容。
在实际应用中,直方图均衡化可以用于图像增强、目标检测、图像匹配等领域。
例如,在安防监控系统中,直方图均衡化可以提高图像的对比度,使得目标物体更加明显,有利于目标检测和识别。
在医学图像处理中,直方图均衡化可以增强图像的细节,有助于医生对病灶的判断和诊断。
然而,直方图均衡化也存在一些局限性。
首先,直方图均衡化是一种全局操作,对整个图像进行处理,可能会导致某些局部细节的损失。
其次,直方图均衡化对于亮度变化较大的图像效果较差,可能会导致过度亮化或过度暗化的问题。
因此,在实际应用中,需要根据具体情况选择合适的图像处理方法。
结论:通过本次实验,我们验证了直方图均衡化在图像处理中的有效性。
直方图均衡化可以增强图像的对比度和细节,使得图像更加清晰明亮。
然而,直方图均衡化也存在一些局限性,需要根据具体情况选择合适的图像处理方法。
图像增强的实验报告
图像增强的实验报告图像增强的实验报告引言:图像增强是数字图像处理领域中的一项重要任务。
通过改善图像的质量和清晰度,图像增强可以使我们更好地观察和分析图像中的细节。
本实验旨在探索图像增强的不同方法,并评估它们在不同场景下的效果。
实验设计:为了比较不同的图像增强方法,我们选择了一组具有不同特征的图像作为实验对象。
这些图像包括自然风景、人像和低对比度图像。
我们将使用以下三种方法进行图像增强:直方图均衡化、自适应直方图均衡化和增强对比度自适应拉伸。
实验步骤: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');原图像原始直方图均衡直方图均衡后的图像:三、体会:通过本次设计,让我学会了从问题的高度来考虑设计的方方面面,对程序的设计和研究有了更深刻的体会;让我了解到程序的设计是建立在对理论知识了解的基础上的,特别是对直方图均衡化的原理要有较为详细的了解,此外对直方图均衡化算法也要进行了解;在编写程序时,进行模块化设计,以严谨的态度进行编程,避免出现低级错误。
实验三直方图及二值化
void CHistogram::OnPaint()
{
CPaintDC dc(this); // device context for painting
CClientDC pDC(this);
CImageApp *app=(CImageApp*)AfxGetApp();
pDC.Rectangle(0, 0, 330, 330);
CPen pen(PS_SOLID,2,RGB(255,0,0));
CPen *redpen = pDC.SelectObject(&pen);
实验三
【实验名称】
直方图及二值化
【实验内容】
设计直方图程序:程序能显示数字图象的直方图,确定直方图上最小、最大、最有代表性的灰度值,可以交互选择阈值并输出二值化图象,进一步自动确定直方图的谷底,并用适当图象检验程序,同时与Phtoshop的显示结果作比较。
灰度直方图(Gray Level Histogram),就是对于图像的每一个灰度值,求出整个图像中具有该灰度值的像素的个数,并用图形表示出来。在本次实验中主要解决的问题:a最大最小灰度值,就是从小到大,以及从大到小,分别找到第一个包含一个以上像素点的灰度值;b最有代表性的灰度值,是把各灰度值包含的像素点的个数做比较,取出最大的那个值,作为图像的第一波峰点;c二值化处理,把各像素点的灰度值和输入的阈值做比较,小于阈值的灰度值置0,大于阈值的灰度值置255。
pDC.TextOut(60, 283, strTemp);
strTemp.Format("100");
数字图像处理实验报告(直方图均衡化、直方图匹配)
实验二报告一.实验内容:⑴直方图均衡化(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. 直方图的显示2. 计算并绘制图像直方图3. 直方图的均衡化二、实验内容灰度直方图用于显示图像的灰度值分布情况,是数字图像处理中最简单和最实用的工具。
MATLAB 中提供了专门绘制直方图的函数imhist()。
1. 直方图的显示imshow('F:\标准图片\baboon.tif');title('原图像')%显示原图像A=imread('F:\标准图片\baboon.tif');figure;imhist(A);title('对应直方图')原图像500100015002000250030003500对应直方图0501001502002502. 计算并绘制图像直方图A :用bar 函数显示A=imshow('F:\标准图片\baboon.tif');h=imhist(A);h1=h(1:10:256);horz=1:10:256;bar(horz,h1)%用bar 函数显示axis([0 255 0 15000])%设置水平轴和垂直轴的最大值和最小值set(gca,'xtick',0:50:255)set(gca,'xtick',0:2000:15000)用bar 函数显示图像0050001000015000B :用stem 函数显示A=imshow('F:\标准图片\baboon.tif');h=imhist(A);h1=h(1:10:256);horz=1:10:256;stem(horz,h1,'fill')%用stem 函数显示axis([0 255 0 15000])%设置水平轴和垂直轴的最大值和最小值set(gca,'xtick',[0:50:255])set(gca,'xtick',[0:2000:15000])用stem 函数显示050001000015000B :用plot 函数显示A=imshow('F:\标准图片\baboon.tif');h=imhist(A);plot(h)axis([0 255 0 15000])%设置水平轴和垂直轴的最大值和最小值set(gca,'xtick',[0:50:255])set(gca,'xtick',[0:2000:15000])用plot 函数显示0500010000150003. 直方图均衡化imshow('F:\标准图片\baboon.tif');title('原图像')I=imread('F:\标准图片\baboon.tif ','tif');figure;imhist(I),title('对应直方图')%从得到的直方图可以看出,图像的对比度很低,灰度级集中在70-160 范围内, 如果只取%这个范围内的灰度,并扩展到[0,255],则会明显增强图像对比度J=imadjust(I,[70/255 160/255],[]);figure;imshow(J),title('经灰度级调整后的图')figure;imhist(J),title('灰度级调整后的直方图')%MATLAB 还提供了histeq 函数(自动直方图均衡化)K=histeq(I);figure;imshow(K),title('经直方图均衡化后的图')figure;imhist(K),title('直方图均衡化后的直方图')原图像500100015002000250030003500对应直方图050100150200250经灰度级调整后的图10002000300040005000600070008000900010000灰度级调整后的直方图050100150200250经直方图均衡化后的图0500100015002000250030003500400045005000直方图均衡化后的直方图050100150200250。
直方图均衡化实验报告
多媒体技术实验报告项目名称: 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图片数据很大时, 可能存在内存溢出的现象。
图像工程概论实验报告——二值化直方图均衡化
图像工程概论实验报告课程报告1:一、实验目的:二、实验内容把这幅图像分成同样大小的10幅人脸图片然后分别对第一行5幅人脸图像的第3 第4 第5 第二行5幅人脸图像的第1 第5 进行如下处理:1.进行大津法阈值分割的二值化处理2.进行直方图均衡化处理三、实验具体代码以及结果(一)大津法阈值分割的二值化处理1.实验代码%图像分割部分clear;clc;pic0=imread('G: \image\histogram matching.bmp');figure(1),imshow(pic0);wdiv=5;hdiv=2;[hd,wd,l]=size(pic0);sub_wd=floor(wd/wdiv);sub_hd=floor(hd/hdiv);for row=1:2for col=1:5pic1=pic0((row-1)*sub_hd+1:row*sub_hd+1,(col-1)*sub_wd+1:col*sub_ wd+1);figure(2),imshow(pic1);imwrite(pic1,['G: \image\'num2str(row) '-'num2str(col) '.jpg'],'jpg'); %存储图像endend%————————图像处理部分cd 'G:\pic'x1=imread('1-3.jpg'); %目标读取图像第一行第三幅人脸图像x2=imread('1-4.jpg'); %第一行第四幅人脸图像x3=imread('1-5.jpg'); %第一行第五幅人脸图像x4=imread('2-1.jpg'); %第二行第一幅人脸图像x5=imread('2-5.jpg'); %第二行第五幅人脸图像%matlab 自动确定阈值的方法,大津法,类间方差level1=graythresh(x1);level2=graythresh(x2);level3=graythresh(x3);level4=graythresh(x4);level5=graythresh(x5);%用得到的阈值直接对图像进行二值化处理并显示BW1=im2bw(x1,level1);BW2=im2bw(x2,level2);BW3=im2bw(x3,level3);BW4=im2bw(x4,level4);BW5=im2bw(x5,level5);subplot(1,5,1),imshow(BW1);subplot(1,5,2),imshow(BW2);subplot(1,5,3),imshow(BW3);subplot(1,5,4),imshow(BW4);subplot(1,5,5),imshow(BW5);2.实验结果显示分割结果截图:进行大津法阈值分割的二值化处理后截图:(二)直方图均衡化处理1.实验代码%图像分割部分clear;clc;pic0=imread('G: \image\histogram matching.bmp'); %figure(1),imshow(pic0);wdiv=5;hdiv=2;[hd,wd,l]=size(pic0);sub_wd=floor(wd/wdiv);sub_hd=floor(hd/hdiv);for row=1:2for col=1:5pic1=pic0((row-1)*sub_hd+1:row*sub_hd+1,(col-1)*sub_wd+1:col*sub_ wd+1);figure(2),imshow(pic1);imwrite(pic1,['G: \image\'num2str(row) '-'num2str(col) '.jpg'],'jpg'); %存储图像endend%图像处理部分cd 'G:\pic'x1=imread('1-3.jpg'); %目标读取图像第一行第三幅人脸图像x2=imread('1-4.jpg'); %第一行第四幅人脸图像x3=imread('1-5.jpg'); %第一行第五幅人脸图像x4=imread('2-1.jpg'); %第二行第一幅人脸图像x5=imread('2-5.jpg'); %第二行第五幅人脸图像%直方图均衡化处理%调用直方图均衡化函数 histeq()%均衡化处理前后的灰度级直方图分布,采用两行十列显示subplot(2,5,1),imhist(rgb2gray(x1)); %第一行第三幅人脸图像subplot(2,5,6),imhist(histeq(rgb2gray(x1)));subplot(2,5,2),imhist(rgb2gray(x2)); %第一行第四幅人脸图像subplot(2,5,7),imhist(histeq(rgb2gray(x2)));subplot(2,5,3),imhist(rgb2gray(x3)); %第一行第五幅人脸图像subplot(2,5,8),imhist(histeq(rgb2gray(x3)));subplot(2,5,4),imhist(rgb2gray(x4)); %第二行第一幅人脸图像subplot(2,5,9),imhist(histeq(rgb2gray(x4)));subplot(2,5,5),imhist(rgb2gray(x5)); %第二行第五幅人脸图像subplot(2,5,10),imhist(histeq(rgb2gray(x5)));%显示均衡化处理后的图像figure(11),imshow(histeq(rgb2gray(x1)));figure(12),imshow(histeq(rgb2gray(x2)));figure(13),imshow(histeq(rgb2gray(x3)));figure(14),imshow(histeq(rgb2gray(x4)));figure(15),imshow(histeq(rgb2gray(x5)));2.实验结果显示①直方图②均衡化处理后人脸图像。
直方图均衡化和直方图规定化-实验报告
一、实验目的掌握直方图均衡化和直方图规定化的图像增强方法掌握图像平滑滤波和锐化滤波的模板计算方法二、实验内容:1. 使用IPT中imhist,histeq函数进行直方图的均衡化和规定化,并显示结果2. 编写myhisteq函数实现直方图均衡化,与1中结果进行对比3. 给读取的图像叠加椒盐噪音(imnoise),分别使用均值滤波和中值滤波进行去噪,并对比图像处理的结果(使用IPT函数)4. 自定义3*3模板矩阵F,编写myfilter函数实现模板和图像的卷积运算,设计模板矩阵,实现图像的平滑和锐化。
三、实验代码及结果(1) 直方图的均衡化和规定化clc;clear;I= imread('H:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像J= histeq( I) ; %对I 进行直方图均衡化figure,subplot( 2,2,1) ,imshow(I) ,title('原始图像') ;subplot (2,2,2), imshow(J), title('直方图均衡化后的图像');subplot( 2,2,3) ,imhist(I, 64), title( '原始的直方图');subplot( 2,2,4) ,imhist(J,64) ,title(' 均衡化后的直方图');clc;clear;I= imread('H:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像h=0:255;h=1-h/255;J= histeq( I,h) ;figure,subplot( 2,3,1) ,imshow(I) ,title('原图像') ; subplot( 2,3,2) ,imhist(I, 64), title( '原图像的直方图'); subplot (2,3,3), stem(h), title('目标直方图');subplot( 2,3,4) ,imshow(I, 64), title( '规定化后的图像'); subplot( 2,3,5) ,imhist(J,64) ,title(' 规定化后的直方图');二、myhisteq函数实现直方图均衡化I = imread('j:\image\jpg\flower.jpg');I = rgb2gray(I);[height,width] = size(I);figuresubplot(2,2,1)imshow(I)%显示原始图像title('原图像');subplot(2,2,2)imhist(I)%显示原始图像直方图title('原图像直方图');%进行像素灰度统计;s = zeros(1,256);%统计各灰度数目,共256个灰度级for i = 1:heightfor j = 1: widths(I(i,j) + 1) = s(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一endend%计算灰度分布密度p = zeros(1,256);for i = 1:256p(i) = s(i) / (height * width * 1.0);end%计算累计直方图分布c = zeros(1,256);c(1) = p(1);for i = 2:256c(i) = c(i - 1) + p(i);end%累计分布取整,将其数值归一化为1~256c = uint8(255 .* c + 0.5);%对图像进行均衡化for i = 1:heightfor j = 1: widthI(i,j) = c(I(i,j)+1);endendsubplot(2,2,3)imshow(I)%显示均衡化后的图像title('均衡化后图像');subplot(2,2,4)imhist(I)%显显示均衡化后的图像的直方图title('均衡化后图像的直方图');三、使用均值滤波和中值滤波进行去噪I= imread('j:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像I1 = imnoise(I,'salt & pepper',0.02);%0.02是噪声强度,其值越大噪声越多h=fspecial('average',5);J1=filter2(h,I1,'valid');J2= imfilter(I1,h,'full');figure,subplot(3,3,1),imshow(I1);title('原始椒盐噪声图像图1');subplot(3,3,2),imshow(uint8(J1));title('filter2均值滤波图2');subplot(3,3,3),imshow(J2);title('imfilter均值滤波图3');J3 = medfilt2(I1,[5,5]);subplot(3,3,4),imshow(J3),title('中值滤波效果图4');G1= histeq(I1);subplot(3,3,5),imhist(G1,64),title('原图均衡化后的直方图');G2= histeq(J1);subplot(3,3,6),imhist(uint8(G2),64),title('图2均衡化后直方图'); G3= histeq(J2);subplot(3,3,7),imhist(G3,64),title('图3均衡化后直方图');G4= histeq(J3);subplot(3,3,8),imhist(G4,64),title('图4均衡化后直方图');问题:对于filter2均值滤波均衡化直方图不显示,不知道原因。
实验二 直方图均衡化
福建农林大学计算机与信息学院实验报告系:专业:年级:姓名:学号:实验室号_______ 计算机号实验时间:指导教师签字:成绩:报告退发(订正、重做)实验二直方图均衡化1.实验目的和要求掌握直方图均衡化算法。
2.实验内容和原理(1)编写一个函数计算数字图像直方图;(2)通过调用直方图计算函数实现直方图均衡化;(3)对比数字图像变化前后的直方图;3.实验环境硬件:一般PC机操作系统:WindowsXP编程平台:MATLAB 或高级语言4.算法描述及实验步骤Code:X=imread(' ‘);subplot(2,2,1) ;imshow(X); title 原图b=size(X);N=b(1)*b(2);n=zeros(1,256);for(i=1:b(1))for(j=1:b(2))n(1,X(i,j)+1)=n(1,X(i,j)+1)+1;end;end;s=zeros(1,256);for(k=1:256)for(j=1:k)s(1,k)=s(1,j)+n(1,j)/N;end;end;Y=zeros(b);for(i=1:b(1))for(j=1:b(2))Y(i,j)=s(1,X(i,j)+1);end;end;Y=mat2gray(Y);subplot(2,2,2) ;imshow(Y); title 均衡化subplot(2,2,3) ;imhist(X); title 原图直方图; subplot(2,2,4) ;imhist(Y); title 均衡化后直方图; figure;Z=zeros(b);Z=histeq(X);subplot(1,2,1) ;imshow(Z); title 原图subplot(1,2,2) ;imhist(Z); title 利用函数均衡化5.调试过程6.实验结果7.总结。
直方图均衡化实验报告
医学图像处理实验报告实验名称:直方图均衡化实验姓名:gao jun qiang 学号:20105405班级:生医1001指导教师:……2013年6月5日一、 实验目的1、编程实现下列功能:读出存储的黑白灰度图象并显示,显示灰度直方图,对图象进行直方图均衡化处理,显示处理后图象及直方图,画出灰度变换曲线,并存储处理后图象。
二、 实验原理直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化是一种自动调节图象对比度质量的算法,使用的方法是灰度级变换:s = T(r) 。
它的基本思想是通过灰度级r 的概率密度函数p(rk ),求出灰度级变换T(r).灰度直方图的计算十分简单,依据定义在离散形式下有下面的公式成立:()1,1,0,-==L k n n k p k Λ (1) 公式中:k n 为图像中出现k s 级灰度的像素数,n 是图像像素总数,而n nk 即为频数。
计算累积直方图各项:()1,1,0,00-===∑∑==L k i p n n t k i ki i k Λ (2) 取整扩展:]5.0)1int[(+-=k k t L t (3)映射对应关系 :k t k ⇒三、实验代码及结果直方图均衡化实验代码:clc;close all;clear all;Imag = imread('lena.tiff');figure()imshow(Imag),title('原图像');ImagGray = rgb2gray(Imag);figure()imshow(ImagGray),title('灰度图像');[r,c] = size(ImagGray);%统计灰度直方图GrayPixNum = zeros(1,255);for i = 1:rfor j = 1:cGrayPixNum(1,ImagGray(i,j)) = GrayPixNum(1,ImagGray(i,j))+1;endend%对灰度直方图进行归一化GrayPixPro = GrayPixNum./(r*c);figure()plot(GrayPixPro),title('图像直方图');%-----------------------------------------------------------% -----------------------直方图均衡化------------------------%-----------------------------------------------------------%直方图累加GrayAdd = zeros(1,255);GrayAdd(1,1) = GrayPixPro(1,1);for i = 2:255GrayAdd(1,i) = GrayAdd(1,i-1)+GrayPixPro(1,i);endNewGray = round(GrayAdd.*254.+0.5);NewGrayPro = zeros(1,255);for i = 1:255GrayTemp = NewGray(1,i);NewGrayPro(1,GrayTemp) = NewGrayPro(1,GrayTemp)+GrayPixPro(1,i); endfigure()plot(NewGrayPro.*(r*c)),title('均衡化直方图');%有均衡化直方图和映射关系得到均衡化的图像NewImag = zeros(r,c);for i =1:rfor j = 1:cNewImag(i,j) = NewGray(1,ImagGray(i,j));endendNewImag = uint8(NewImag);figure()imshow(NewImag),title('均衡化的图像');figure()plot(NewGray),title('灰度变换曲线');实验结果:图1 原灰度图像图2 原图像的灰度直方图图3 经过直方图均衡化后的灰度图片图4 均衡化后的直方图图5 灰度变化曲线三、实验思考从上述实验结果可以看出,经过直方图均衡化后的图片的对比度更高,且边缘效果更高。
统计图像直方图及图像均衡化
数字图像处理实验报告一、实验内容: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、数组赋值需用{}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像工程概论
实验报告
课程报告1:
一、实验目的:
二、实验内容
把这幅图像分成同样大小的10幅人脸图片
然后分别对第一行5幅人脸图像的第3 第4 第5 第二行5幅人脸图像的第1 第5 进行如下处理:
1.进行大津法阈值分割的二值化处理
2.进行直方图均衡化处理
三、实验具体代码以及结果
(一)大津法阈值分割的二值化处理
1.实验代码
%图像分割部分
clear;
clc;
pic0=imread('G: \image\histogram matching.bmp');
figure(1),imshow(pic0);
wdiv=5;
hdiv=2;
[hd,wd,l]=size(pic0);
sub_wd=floor(wd/wdiv);
sub_hd=floor(hd/hdiv);
for row=1:2
for col=1:5
pic1=pic0((row-1)*sub_hd+1:row*sub_hd+1,(col-1)*sub_wd+1:col*sub_ wd+1);
figure(2),imshow(pic1);
imwrite(pic1,['G: \image\'num2str(row) '-'num2str(col) '.jpg'],'jpg'); %存储图像
end
end
%————————图像处理部分
cd 'G:\pic'
x1=imread('1-3.jpg'); %目标读取图像第一行第三幅人脸图像
x2=imread('1-4.jpg'); %第一行第四幅人脸图像
x3=imread('1-5.jpg'); %第一行第五幅人脸图像
x4=imread('2-1.jpg'); %第二行第一幅人脸图像
x5=imread('2-5.jpg'); %第二行第五幅人脸图像
%matlab 自动确定阈值的方法,大津法,类间方差
level1=graythresh(x1);
level2=graythresh(x2);
level3=graythresh(x3);
level4=graythresh(x4);
level5=graythresh(x5);
%用得到的阈值直接对图像进行二值化处理并显示
BW1=im2bw(x1,level1);
BW2=im2bw(x2,level2);
BW3=im2bw(x3,level3);
BW4=im2bw(x4,level4);
BW5=im2bw(x5,level5);
subplot(1,5,1),imshow(BW1);
subplot(1,5,2),imshow(BW2);
subplot(1,5,3),imshow(BW3);
subplot(1,5,4),imshow(BW4);
subplot(1,5,5),imshow(BW5);
2.实验结果显示
分割结果截图:
进行大津法阈值分割的二值化处理后截图:
(二)直方图均衡化处理
1.实验代码
%图像分割部分
clear;
clc;
pic0=imread('G: \image\histogram matching.bmp'); %figure(1),imshow(pic0);
wdiv=5;
hdiv=2;
[hd,wd,l]=size(pic0);
sub_wd=floor(wd/wdiv);
sub_hd=floor(hd/hdiv);
for row=1:2
for col=1:5
pic1=pic0((row-1)*sub_hd+1:row*sub_hd+1,(col-1)*sub_wd+1:col*sub_ wd+1);
figure(2),imshow(pic1);
imwrite(pic1,['G: \image\'num2str(row) '-'num2str(col) '.jpg'],'jpg'); %存储图像
end
end
%图像处理部分
cd 'G:\pic'
x1=imread('1-3.jpg'); %目标读取图像第一行第三幅人脸图像
x2=imread('1-4.jpg'); %第一行第四幅人脸图像
x3=imread('1-5.jpg'); %第一行第五幅人脸图像
x4=imread('2-1.jpg'); %第二行第一幅人脸图像
x5=imread('2-5.jpg'); %第二行第五幅人脸图像
%直方图均衡化处理
%调用直方图均衡化函数 histeq()
%均衡化处理前后的灰度级直方图分布,采用两行十列显示
subplot(2,5,1),imhist(rgb2gray(x1)); %第一行第三幅人脸图像subplot(2,5,6),imhist(histeq(rgb2gray(x1)));
subplot(2,5,2),imhist(rgb2gray(x2)); %第一行第四幅人脸图像subplot(2,5,7),imhist(histeq(rgb2gray(x2)));
subplot(2,5,3),imhist(rgb2gray(x3)); %第一行第五幅人脸图像subplot(2,5,8),imhist(histeq(rgb2gray(x3)));
subplot(2,5,4),imhist(rgb2gray(x4)); %第二行第一幅人脸图像subplot(2,5,9),imhist(histeq(rgb2gray(x4)));
subplot(2,5,5),imhist(rgb2gray(x5)); %第二行第五幅人脸图像subplot(2,5,10),imhist(histeq(rgb2gray(x5)));
%显示均衡化处理后的图像
figure(11),imshow(histeq(rgb2gray(x1)));
figure(12),imshow(histeq(rgb2gray(x2)));
figure(13),imshow(histeq(rgb2gray(x3)));
figure(14),imshow(histeq(rgb2gray(x4)));
figure(15),imshow(histeq(rgb2gray(x5)));
2.实验结果显示
①直方图
②均衡化处理后人脸图像。