版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图像处理实验局部翻开图像1 .创立 MFC Application 工程: 文件名称:Mylmage2 .添加cdib.h和cdib.cpp到工程工程中(也可以在工程工程中创立这两个文 件,需要编写程序)3 .在MyImageDoc.h文件中增加如下语句public:CDib *m_pDib;(此类中增加成员变量表示Cdib对象的指针)4 .在MyImageDoc.cpp文件中的构造函数中添加:m_pDib = new CDib;在析构函数中添加delete m_pDib;5 .在 MyImageDoc.h文件中添力口 #include cdib.h6 .在 Doc.cpp 中 CMyImag
2、eDoc二Serialize(CArchive& ar)函数中添加:m_pDib-Serialize(ar);用CDib的串行化来实现 CDisplayBmpImDoc文档的串行化.7 .在CMyImageView.h中添加变量声明public :int lWidth;CPoint StartPoint;int lHeight;CPoint EndPoint;long int lLineBytes;bool m_bTwoValue;8 . CMyImageView.cpp文件中的OnDraw()函数中添加代码void CMyImageView:OnDraw(CDC* pDC)CSize siz
3、e;int lHeight,lWidth;if (pDoc-m_pDib-m_lpBMIH!=NULL)lWidth=pDoc-m_pDib-m_lpBMIH-biWidth;lHeight=pDoc-m_pDib-m_lpBMIH-biHeight;size.cx=lWidth;size.cy=lHeight;pDoc-m_pDib-Draw(pDC,CPoint(0,0),size);运行,即可翻开一幅BMFB式的图像、灰度化与直方图01449X88405砥9.bmp呼 WsH图1初始图片图2灰度化图片作为原图片使用图3灰度化图片直方图灰度化图片直方图生成流程图二、图像滤波(一)均值滤波(
4、3*3模板)根本思想:根本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x, y),选择一个模板,该模板由其近邻的假设干像素组成,求模板中所 有像素的均值,再把该均值赋予当前像素点( x, y),作为处理后图像在该 点上的灰度值g (x, y).步骤如下:1 .在资源菜单 menu中Hist Modify中添加菜单按钮 Mean Filter2 . ID名称可以随意修改,也可以默认.3 .中CMyImage点击右键,选择属性在下拉菜单中找到ID_IMGSMOOTHMEANFILTER ,添加代码4 .在 MyImageView.cpp 中出现void CMyImageView:
5、OnImgsmoothMeanfilter() 函数5 .在其中添加代码void CMyImageView:OnImgsmoothMeanfilter()CMyImageDoc* pDoc = GetDocument();int lHeight=pDoc-m_pDib-m_lpBMIH-biHeight;int lWidth=pDoc-m_pDib-m_lpBMIH-biWidth;int lLineBytes=(lWidth+3)/4*4;unsigned char *lpSrc;unsigned char *lpDst;unsigned char *lpNewDib;lpNewDib= n
6、ew unsigned char lLineBytes*lHeight;memcpy(lpNewDib,pDoc-m_pDib-m_lpImage,lLineBytes*lHeight);for ( int i = 0; i m_pDib-m_lpImage + lLineBytes* (lHeight-1-i);lpDst = lpNewDib + lLineBytes* (lHeight-1-i);for ( int j =0; j 0 & i0 & jm_pDib-m_lpImage,lpNewDib,lLineBytes*lHeight);Invalidate( true );Mess
7、ageBox(L均值滤波);(二)中值滤波(3*3模板)根本思想:中值滤波的根本原理是把数字图像或数字序列中一点的信用该点的一 个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤 立的噪声点.方法是去某种结构的二维滑动模板,将板内像素根据像素值 的大小进行排序,生成单调上升的二维数据序列,并取出序列中位于中间位 置的灰度作为中央像素的灰度.步骤如下:1 .在资源菜单 menu中Hist Modify中添加菜单按钮 Median Filter2 .中CMyImage点击右键,选择属性在下拉菜单中找到ID_IMGSMOOTHMEDIANFILTER ,添加代码3 .在 MyImage
8、View.cpp 中出现void CMyImageView:OnImgsmoothMedianfilter() 函数4 .在其中添加代码void CMyImageView:OnImgsmoothMedianfilter()CMyImageDoc* pDoc = GetDocument();int lHeight=pDoc-m_pDib-m_lpBMIH-biHeight;int lWidth=pDoc-m_pDib-m_lpBMIH-biWidth;int lLineBytes=(lWidth+3)/4*4;unsigned char *lpSrc;unsigned char *lpDst;u
9、nsigned char *lpNewDib;lpNewDib= new unsigned char lLineBytes*lHeight;memcpy(lpNewDib,pDoc-m_pDib-m_lpImage,lLineBytes*lHeight);for ( int i = 0; i m_pDib-m_lpImage + lLineBytes* (lHeight-1-i);lpDst = lpNewDib + lLineBytes* (lHeight-1-i);for ( int j =0; j 0 & i0 & jlWidth-1) int a9=0; int m,n,temp;a0
10、=*(lpSrc);a1=*(lpSrc+1);a2=*(lpSrc+lLineBytes);a3=*(lpSrc-lLineBytes);a4=*(lpSrc+lLineBytes+1);a5=*(lpSrc-lLineBytes +1);a6=*(lpSrc-1);a7=*(lpSrc+lLineBytes-1);a8=*(lpSrc-lLineBytes-1); for (n=0;n9;n+) for (m=n+1;m9;m+) if (anm_pDib-m_lpImage,lpNewDib,lLineBytes*lHeight);Invalidate( true );MessageBo
11、x(L中值滤波);(三)均值滤波(5*5模板)1 .在资源菜单 menu中Hist Modify中添加菜单按钮 Median Filter52 .中CMyImage点击右键,选择属性在下拉菜单中找到ID_IMGSMOOTHMEDIANFILTER5 ,添加代码3 .在 MyImageView.cpp 中出现void CMyImageView:OnImgsmoothMedianfilter5() 函数4 .在其中添加代码void CMyImageView:OnImgsmoothMeanfilter5() (for ( int i = 0; i m_pDib-m_lpImage + lLineBy
12、tes* (lHeight-1-i);lpDst = lpNewDib + lLineBytes* (lHeight-1-i) ;for ( int j =0; j 0 & i0 & jm_pDib-m_lpImage,lpNewDib,lLineBytes*lHeight);Invalidate( true );MessageBox(L均值滤波 5*5);(四)中值滤波(5*5模板)1 .在资源菜单 menu中Hist Modify中添加菜单按钮 Median Filter52 .中CMyImage点击右键,选择属性在下拉菜单中找到ID_IMGSMOOTHMEDIANFILTER5 ,添加代
13、码3 .在 MyImageView.cpp 中出现void CMyImageView:OnImgsmoothMedianfilter() 函数4 .在其中添加代码void CMyImageView:OnImgsmoothMedianfilter5()(for ( int i = 0; i m_pDib-m_lpImage + ILineBytes* (lHeight-1-i);IpDst = lpNewDib + lLineBytes* (lHeight-1-i);for ( int j =0; j 0 & i0 & jlWidth-1) (int a25=0; int m,n,temp;a0
14、=*(lpSrc);a1=*(lpSrc+1);a2=*(lpSrc+lLineBytes);a3=*(lpSrc-lLineBytes);a4=*(lpSrc+lLineBytes+1);a5=*(lpSrc-lLineBytes+1);a6=*(lpSrc-1);a7=*(lpSrc+lLineBytes-1);a8=*(lpSrc-lLineBytes-1);a9=*(lpSrc-2*lLineBytes);a10=*(lpSrc+2*lLineBytes);a11=*(lpSrc-2*lLineBytes-1);a12=*(lpSrc-2*lLineBytes-2);a13= *(lp
15、Src-2*lLineBytes+1);a14= *(lpSrc-2*lLineBytes+2);a15=*(lpSrc+2*lLineBytes-1);a16=*(lpSrc+2*lLineBytes-2);a17 =*(lpSrc+2*lLineBytes+1); a18=*(lpSrc+2*lLineBytes+2);a19= *(lpSrc+2);a20=*(lpSrc-2);a21=*(lpSrc+lLineBytes+2);a22=*(lpSrc-lLineBytes+2);a23=*(lpSrc+lLineBytes-2);a24=*(lpSrc-lLineBytes-2);fo
16、r (n=0;n25;n+) for (m=n+1;m25;m+) if (anm_pDib-m_lpImage,lpNewDib,lLineBytes*lHeight);Invalidate( true );MessageBox(L中值滤波);(五)运行结果比拟和分析结果分析:这个取均值的模板其实是一个低通滤波器.因图像细节信息主要分布在高频 区域,因此均值滤波的过程会导致图像变模糊. 如果模板选取过大,那么这种模糊 会加剧;模板选择越小,去噪水平会下降.即3*3模板去噪水平没有5*5模板强, 但5*5模板的处理室图像更模糊,如图1,2,3,4,5所示.用3*3的模板和5*5处理图像,结果不
17、一样.5*5的模板产生的图形边缘更 模糊,亮点更少.同时使用中值滤波算法,可以在保护图像边缘同时去除处噪声, 而均值滤波不能对图像边缘保护,如图 1,2,3,4,5所示.对于椒盐噪声,中值滤波能在去除噪声的同时较好的保持图像边缘,而均值滤波效果不佳.如图6,7,8所示.原图像均值与中值滤波流程图图6添加椒盐噪声图像图7 3*3均值滤波图8 3*3 中值滤波三、边缘检测(一)梯度算子(以Priwitt为例)根本思想:利用梯度幅值在边缘处到达极值检测边缘.该法不受施加运算方向限制,同时能获得边缘方向信息,定位精度高,但对噪声较为敏感.主要代码:void CMyImageView:OnEdgePri
18、witt()(CMyImageDoc* pDoc = GetDocument();int lHeight=pDoc-m_pDib-m_lpBMIH-biHeight;int lWidth=pDoc-m_pDib-m_lpBMIH-biWidth;int lLineBytes=(lWidth+3)/4*4;unsigned char *lpSrc; unsigned char *lpDst;unsigned char *lpNewDib;lpNewDib=new unsigned char lLineBytes*lHeight;memcpy(lpNewDib,pDoc-m_pDib-m_lpIm
19、age,lLineBytes*lHeight);for ( int i = 0; i m_pDib-m_lpImage + lLineBytes* (lHeight-1-i);lpDst = lpNewDib + lLineBytes* (lHeight-1-i);for ( int j =0; j 0 & i0 & jm_pDib-m_lpImage,lpNewDib,lLineBytes*lHeight);Invalidate( true );MessageBox(LPrewitt 边缘提取);)(二)Sobel 算子根本思想:Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处到达
20、极值这一 现象检测边缘.对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位 精度不够高.当对精度要求不是很高时,是一种较为常用的边缘检测方法. 主要代码:、void CMyImageView:OnEdgeSobel() CMyImageDoc* pDoc = GetDocument();unsigned char * lpSrc; unsigned char * lpDst;unsigned char * lpNewDIBBits;lpNewDIBBits= new unsigned char lLineBytes*lHeight;if (lpNewDIBBits = NULL)retu
21、rn ;)BeginWaitCursor();lpSrc=( unsigned char *)pDoc-m_pDib-m_lpImage;memcpy( lpNewDIBBits,lpSrc, lLineBytes * lHeight);int pixel8;for ( int i = 0; i m_pDib-m_lpImage + lLineBytes* (lHeight-1-i)-1;lpSrc =lpNewDIBBits + lLineBytes * (lHeight - 1 - i)-1;for ( int j =0; j 0 & i0 & j255if (result255) res
22、ult=255;*lpDst = ( unsigned char )result; *lpDst&=0xfc;if (tmp2=0) tmp2=1;double tha=atan( double (tmp1)/tmp2);if (abs(tha)Pi/8 & thaPi*3/8)*lpDst=*lpDst+1;elseif (tha-Pi*3/8) *lpDst=*lpDst+3;else*lpDst=*lpDst+2; else *lpDst=0;CString str=pDoc-GetTitle();pDoc-SetTitle(str+L-Sobel );InvalidateRect(CR
23、ect(0,0,lHeight,lWidth),true );EndWaitCursor();delete 口lpNewDIBBits;MessageBox(LSobel 边缘提取); (三)拉普拉斯算子根本思想:Laplace算子是二阶微分算子,利用边缘点处二阶导函数出现零交叉原理检 测边缘.不具方向性,对灰度突变敏感,定位精度高,同时对噪声敏感,且不能 获得边缘方向等信息.主要代码:void CMyImageView:OnEdgeLaplace()CMyImageDoc* pDoc = GetDocument();unsigned char * lpSrc; unsigned char *
24、 lpDst;unsigned char * lpNewDIBBits;lpNewDIBBits= new unsigned char lLineBytes*lHeight;if (IpNewDIBBits = NULL) (return ;BeginWaitCursor();lpSrc=( unsigned char *)pDoc-m_pDib-m_lpImage;memcpy( lpNewDIBBits,lpSrc, ILineBytes * lHeight);intpixel8;for(int i = 0; i m_pDib-m_lpImage +lLineBytes* (lHeight
25、-1-i)-1;lpSrc =lpNewDIBBits + lLineBytes * (lHeight - 1 - i)-1;for ( int j =0; j 0 & i0 & jlWidth-1)pixel0 = (int)*(lpSrc+lLineBytes-1);pixel1 = (int)*(lpSrc+lLineBytes);pixel2=(int)*(lpSrc+lLineBytes+1);pixel3=(pixel4=(intint)*(lpSrc-1);)*(lpSrc+1);pixel5=(int)*(lpSrc - lLineBytes-1);pixel6=(int)*(
26、lpSrc - lLineBytes);pixel7=(int)*(lpSrc - lLineBytes+1);int Tmp=0;for (int k=0;k255) Tmp=255;if (TmpGetTitle();true );pDoc-SetTitle(str+L-Laplace);InvalidateRect(CRect(0,0,lHeight,lWidth),EndWaitCursor();delete lpNewDIBBits;MessageBox(LLaplace 边缘提取);四运行结果及分析由图1-4可知,前两种算子的检测结果根本相同,而拉普拉斯算子能提取对 比度弱的边缘,
27、边缘定位精确度高.梯度算子得到的图像边缘更陡峭、清楚.Sobel算子具有平滑作用,能滤除一些噪声,去掉局部伪边缘,但同时也平滑了真正的边缘;定位精度不高.Laplace算子只能获得边缘位置信息,不能得到边缘的方向等信息.图1原图像图2 Prewitt边缘提取3 sobel 边缘提取图4拉普拉斯边缘提取图四、固定阀值法、最大嫡分割方法、最大类间方差法(一)固定阈值分割根本思想:利用图像的灰度特征来选择一个最正确阈值,使前景和背景的两个灰度级分布 的有效信息为最大.主要代码:void CMyImageView:OnSegmentationMaxlikelihood()CMyImageDoc* pD
28、oc = GetDocument();BeginWaitCursor(); int lHistogram256=0; GetHistgram(lHistogram, true ); int meanBack,meanObj; int ABack,AObj; ABack=0; for ( int i = 0; i 256;i+) if (ABacklHistogrami) ABack=(int )lHistogrami; /max meanBack=i; int minH=0; while (lHistogramminH卜ABack/20) minH+; int maxH=255; while
29、(lHistogrammaxH卜ABack/20) maxH-; AObj=0; int pos=meanBack-(maxH-minH)/3; int min=lHistogrammeanBack; if (pos10) for ( int i =pos ; i=0 ;i-) if (minlHistogrami) min=lHistogrami; else pos=i; break ; if (min=0 ;i-) if (AObj255) pos=255; if (meanBack250) for ( int i = pos; ilHistogrami) min=lHistogrami;
30、else (pos=i; break ; ) if (min10) pos=i; break ; ) ) for ( int i = pos; i 256 ;i+) if (AObjlHistogrami) AObj=(int )lHistogrami; /max meanObj=i;) ) ) if (meanObj10) while (pos0 & !bfind) pos-; double dtmp=( double )lHistogrampos)/ABack; if (dtmpexp(-0.5) bfind= true ; ) ) else while (pos255 & !bfind)
31、 pos+; double dtmp=( double )lHistogrampos)/ABack; if (dtmpexp(-0.5) bfind= true ; ) ) segmBack=abs(pos-meanBack);if (segmBackmeanObj-meanBack)segmBack=(meanObj-meanBack)/3;double segmObj; pos=meanObj; bfind= false ;if (meanObj255-10)while (pos0 & !bfind) pos-;double dtmp=( double )lHistogrampos)/AO
32、bj; if (dtmpexp(-0.5) bfind= true ; else while (pos255 & !bfind) pos+;double dtmp=( double )lHistogrampos)/AObj; if (dtmpexp(-0.5) bfind= true ; segmObj=abs(pos-meanObj);if (segmObjmeanObj-meanBack)segmObj=(meanObj-meanBack)/3;TRACEnmeanBack=%d,segmBack=%3.1f,meanObj=%d,segmObj=%3.1f ,meanBack,segmB
33、ack,meanObj ,segmObj);double Th=AObj*segmObj/(AObj*segmObj+ABack*segmBack);double A,B,C;A=segmObj*segmObj-segmBack*segmBack;B=2.0*(-meanBack*segmObj*segmObj+meanObj*segmBack*segmBack);C=meanBack*meanBack*segmObj*segmObj-meanObj*meanObj*segmBack*segmBack -2.0*segmObj*segmObj*segmBack*segmBack*10g(segmObj/segmBack*(1.0-Th)/Th);if (A0.01 | AmeanBack & t1meanBack & t20.01 | B-0.01)THRESHOLDi=n(t )max(-C/B+0.5),0.0); elseTHRESHOLD=0;Fixedthreshold();CString str;str.Format(L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026青海省核工业核地质研究院非编工勤岗人员招聘2人备考题库含答案详解(轻巧夺冠)
- 2026云南德宏州芒市建投人力资源服务有限公司招聘7人备考题库附答案详解(夺分金卷)
- 2026宁波东方人力资源服务有限公司招聘编外人员1人备考题库及答案详解(夺冠)
- 2026广西梧州市苍梧县招聘防贫监测信息员2人备考题库附答案详解(黄金题型)
- 2026湖北武汉大学人民医院幼儿园教师招聘2人备考题库含答案详解(预热题)
- 2026滁州市轨道交通运营有限公司第一批次校园招聘21人备考题库附答案详解(基础题)
- 2026江苏徐州市新盛集团下属中山置业公司招聘1人备考题库附答案详解(巩固)
- 2026辽宁营口市西市区司法局招聘公益性岗位人员1人备考题库含答案详解(精练)
- 2026安徽长江产权交易所及下属子企业招聘工作人员4人备考题库及答案详解(全优)
- 《“精彩极了”和“糟糕透了”》教学设计
- 新解读《JTGT 3660-2020公路隧道施工技术规范》
- MAM6090空压 机微电脑控制器说明书
- JTG-H30-2015公路养护安全作业规程
- 采用矿山法、盾构法、顶管法施工的隧道、洞室工程
- MH-T 5059-2022民用机场公共信息标识系统设置规范
- 企业行政管理实务(含活页实训手册) 课件 9建立工作程序
- 思皓E10X保养手册
- 安全监理考试题库
- 市政道路改造管网施工组织设计
- 海外项目科技技术管理探讨汇报材料
- 2022年菏泽职业学院教师招聘考试真题
评论
0/150
提交评论