ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:41.73KB ,
资源ID:11158354      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11158354.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第8章 图象的检测及模板匹配.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第8章 图象的检测及模板匹配.docx

1、第8章 图象的检测及模板匹配第8章 图象的检测及模板匹配图象的分割与检测(识别)实际上是一项非常困难的工作。很难说清楚为什么图象应该分割成这样而不是那样。人类的视觉系统是非常优越的,它不仅包含了双眼,还包括了大脑,可以从很复杂的景物中分开并识别每个物体,甚至可以毫不费力地跟上每秒好几十帧变化的图象。举两个例子来说明一下人类视觉系统的优越性。图8.1 单词THE图8.2 看不见的三角图8.1是单词THE,这一点很容易看出来,但仔细观察一下,就会发现,图中少了很多线条。在我们人类看来很简单的一件事,让计算机来做就很困难了。图8.2中尽管没有任何线条,但我们还是可以很容易的看出中间存在着一个白色三角

2、形。计算机却很难发现。由于人类在观察图象时适用了大量的知识,所以没有任何一台计算机在分割和检测真实图象时,能达到人类视觉系统的水平。正因为如此,对于大部分图象应用来说,自动分割与检测还是一个将来时。目前只有少数的几个领域(如印刷体识别OCR)自动识别达到了实用的水平。也许算是题外话,我们可以憧憬这样一种应用:基于内容的搜索。在一场足球比赛的录象中,用户可以输入命令,由计算机自动搜索出所有射门的镜头并显示在屏幕上。目前,我们能从一幅图象中获得的信息只是每个象素的颜色或灰度值,除此以外别无其它,完成上述功能实在是太困难了。所以说解决图象分割和检测最根本的方法是在编码(成象)时就给予考虑。这也正是M

3、PEG4及未来的视频压缩编码标准的主要工作。正因为有上述的困难,所以我们今天要介绍的只是一些最基本,最简单的算法和思想,针对也只能是一些具体(而不是通用)的应用。算法共有三个:投影法、差影法和模板匹配。8.1 投影法在介绍投影法之前,我先出一道题目,下面的这幅照片是著名的华盛顿纪念碑(我记得在“阿甘正传”中曾经看到过它),怎样从图中自动检测到水平方向上纪念碑的位置。仔细观察,不难发现,纪念碑上象素的灰度都差不多而且与众不同,如果我们选取合适的阈值,做削波处理(这里选175到220),将该图二值化,如图8.3所示:图8.3 华盛顿纪念碑图8.4 削波处理,将图8.3二值化由于纪念碑所在的那几列的

4、白色点比起其他列多很多,如果把该图在垂直方向做投影,如图8.5所示。图8.5 图8.4做垂直方向投影其中,黑色线条的高度代表了该列上白色点的个数。图中间的高峰部分就是我们要找的水平方向上纪念碑所在的位置,这就是投影法。可以看出投影法是一种很自然的想法,有点象灰度直方图。为了得到更好的效果,投影法经常和阈值化一起使用。由于噪声点对投影有一定的影响,所以处理前最好先做一次平滑,去除噪声。以下是投影法的源程序,第二个参数是个BOOL变量,为真时表示在水平方向上做投影,否则在垂直方向上做投影。要注意的是,我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。

5、BOOL Projection(HWND hWnd,BOOL Hori) DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y; int num;/用的是256级灰度图,不过只用到了0和255两种灰度级。 if( NumColors!=256) MessageBox(hWnd,Must be a mono bitmap w

6、ith grayscale palette!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE;/到位图数据的偏移值 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); /缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes;/为新图缓冲区分配内存 if(hTempImgData=LocalAlloc(LHND,BufSize)=NULL) MessageBox(hWnd,Error alloc memory!,Error Message,MB_OK|MB_ICO

7、NEXCLAMATION); return FALSE; lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); /新图缓冲区初始化为255memset(lpTempImgData,(BYTE)255,BufSize);/拷贝头信息 memcpy(lpTempImgData,lpImgData,OffBits); if(Hori) /水平投影 for(y=0;ybi.biHeight;y+) lpPtr=(char *)lpImg

8、Data+(BufSize-LineBytes-y*LineBytes); num=0; /计数器初始化为0 for(x=0;xbi.biWidth;x+) if(*(lpPtr+)!=0) /是白点 num+; /计数器加1 lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes); for(x=0;xnum;x+) *(lpTempPtr+)=0; /在新图中,该行中共有num个黑点 else /垂直投影 for(x=0;xbi.biWidth;x+) num=0; /计数器初始化为0 lpPtr=(char *)lpI

9、mgData+(BufSize-LineBytes)+x; for(y=0;ybi.biHeight;y+) if(*lpPtr!=0) num+; /计数器加1 lpPtr-=LineBytes; lpTempPtr=(char *)lpTempImgData+OffBits+x; for(y=0;ynum;y+) *lpTempPtr=0; /在新图中,该列中共有num个黑点 lpTempPtr+=LineBytes; if(hBitmap!=NULL) DeleteObject(hBitmap); hDc=GetDC(hWnd); /创立一个新的位图 hBitmap=CreateDIBi

10、tmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+ NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS); /起不同的结果文件名 if(Hori) hf=_lcreat(c:hproject.bmp,0); else hf=_lcreat(c:vproject.bmp,0); _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFIL

11、EHEADER); _lwrite(hf,(LPSTR)lpTempImgData,BufSize); _lclose(hf); /释放内存和资源 ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE;8.2 差影法差影法的原理非常简单:将前后两幅图象相减,得到的差作为结果结果图象。图8.6、图8.7、图8.8能够说明差影法的原理。图8.6 前景+背景图8.7 背景图8.8 图8.6、图8.7相减的结果图8.6是前景图(猫)加背景图

12、(木星)。图8.7是背景图。图8.6减图8.7的结果如图8.8所示,这样就得到了前景(不完全是前景,因为背景的灰度值并不为零,但至少可以得到前景的形状)。差影法是非常有用的,比如说可以用在监控系统中。在银行金库内,摄像头每隔一小段时间,拍摄一幅图,与上一幅图做差影;如果差别超过了预先设置的阈值,说明有人,这时就应该拉响警报。我们在介绍灰度窗口变换时,曾经提到了电影“阿甘正传”特技中应用了“蓝幕”技术,其实也包含了差影法的原理。以下是差影法的源程序。要注意的是,第一幅图的文件名为c:test.bmp,第二幅图的文件名是c:backgnd.bmp。它们有着相同的灰度值和调色板。执行时,这两个文件都

13、已经准备好。我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。BOOL Subtraction(HWND hWnd) DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HGLOBAL hSecond; LPBITMAPINFOHEADER lpSecondImgData; LPSTR lpSecondPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc;

14、 HFILE hf; LONG x,y; int num,pos;/用的是256级灰度图,不过只用到了0和255两种灰度级。 if( NumColors!=256)MessageBox(hWnd,Must be a mono bitmap with grayscale palette!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE; if(hf=_lopen(c:backgnd.bmp,OF_READ)=HFILE_ERROR) /背景图没找到 MessageBox(hWnd,File c:backgnd.bmp not found!

15、,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE;/到位图数据的偏移值 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); /缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes; /为背景图的数据分配内存 if(hSecond=GlobalAlloc(GHND,BufSize)=NULL) MessageBox(hWnd,Error alloc memory!,Error Message,MB_OK|MB_ICONEXCLAMATION); _lclose(h

16、f); return FALSE;/指向该内存指针lpSecondImgData=(LPBITMAPINFOHEADER)GlobalLock(hSecond);/文件指针指到BITMAPINFOHEADER结构开始的地方 _llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN); /读入头信息和位图数据 _lread(hf,(LPSTR)lpSecondImgData,BufSize); _lclose(hf); /为结果图缓冲区分配内存 if(hTempImgData=LocalAlloc(LHND,BufSize)=NULL) MessageBox(

17、hWnd,Error alloc memory!,Error Message,MB_OK|MB_ICONEXCLAMATION); GlobalUnlock(hSecond); GlobalFree(hSecond);return FALSE; lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); /新图缓冲区初始化为255memset(lpTempImgData,(BYTE)255,BufSize);/拷贝头信息 memcpy

18、(lpTempImgData,lpImgData,OffBits); for(y=0;ybi.biHeight;y+) pos=(BufSize-LineBytes-y*LineBytes); /lpPtr指向第一幅图,lpSecondPtr指向第二幅图,lpTempPtr指向结果图 lpPtr=(char *)lpImgData+pos; lpSecondPtr=(char *)lpSecondImgData+pos; lpTempPtr=(char *)lpTempImgData+pos; for(x=0;xbi.biWidth;x+) num=(unsigned char)*(lpPtr

19、+); num-=(unsigned char)*(lpSecondPtr+); *(lpTempPtr+)=(unsigned char)fabs(num); /两者相减取绝对值,存入新图中 if(hBitmap!=NULL) DeleteObject(hBitmap); hDc=GetDC(hWnd); /创立一个新的位图 hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*siz

20、eof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);hf=_lcreat(c:subtract.bmp,0); _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER); _lwrite(hf,(LPSTR)lpTempImgData,BufSize); _lclose(hf); /释放内存和资源 ReleaseDC(hWnd,hDc); GlobalUnlock(hSecond); GlobalFree(hSecond); LocalUnlock(hTempImgData); LocalFree

21、(hTempImgData); GlobalUnlock(hImgData); return TRUE;8.3 模板匹配利用模板匹配可以在一幅图象中找到已知的物体。比如抓拍到了一张射门的照片,要在该照片中找到足球的位置。这时就可以采用模板匹配的方法。所谓模板匹配,其实想法很简单:拿已知的模板(在本例中为足球的图象),和原图象中同样大小的一块区域去对。最开始时,模板的左上角点和图象的左上角点是重合的,拿模板和原图象中同样大小的一块区域去对比,然后平移到下一个象素,仍然进行同样的操作,所有的位置都对完后,差别最小的那块就是我们要找的物体。我们用平方误差之和来衡量原图中的块和模板之间的差别。假设模板

22、的大小为mn(宽高);图象的大小为WidthHeight。模板中的某点坐标为(x0,y0),该点的灰度为U(x0,y0);与之重合的图象中的点坐标为(X0-x0,Y0-y0),该点的灰度为V(X0-x0,Y0-y0)。则一次匹配的结果为:全部图象都匹配后,找到最小的即为结果。可以看到模板匹配的运算量是惊人的。一次匹配都要做mn次减法,mn次平方,mn-1次加法,整个图象要匹配(Width-m+1) (Height-n+1)次。源程序不再给出,有兴趣的读者可以自己完成。The University of Southern California does not screen or control

23、 the content on this website and thus does not guarantee the accuracy, integrity, or quality of such content. All content on this website is provided by and is the sole responsibility of the person from which such content originated, and such content does not necessarily reflect the opinions of the University administration or the Board of Trustees

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1