图像工程概论实验报告——二值化直方图均衡化

合集下载

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

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

数字图像处理实验报告直⽅图均衡化课程设计课程名称数字图像处理题⽬名称直⽅图均衡化学⽣学院信息⼯程学院专业班级 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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.实验结果显示
①直方图
②均衡化处理后人脸图像。

相关文档
最新文档