图象的检测及模板匹配_第1页
图象的检测及模板匹配_第2页
图象的检测及模板匹配_第3页
图象的检测及模板匹配_第4页
图象的检测及模板匹配_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

4、60; 华盛顿纪念碑图8.4    削波处理,将图8.3二值化由于纪念碑所在的那几列的白色点比起其他列多很多,如果把该图在垂直方向做投影,如图8.5所示。图8.5     图8.4做垂直方向投影其中,黑色线条的高度代表了该列上白色点的个数。图中间的高峰部分就是我们要找的水平方向上纪念碑所在的位置,这就是投影法。可以看出投影法是一种很自然的想法,有点象灰度直方图。为了得到更好的效果,投影法经常和阈值化一起使用。由于噪声点对投影有一定的影响,所以处理前最好先做一次平滑,去除噪声。以下是投影法的源程序,第二个参数是个BOOL变量,

5、为真时表示在水平方向上做投影,否则在垂直方向上做投影。要注意的是,我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。BOOL Projection(HWND hWnd,BOOL Hori)       DWORD               OffBits,BufSize;LPBITMAPINFOHEADER    lpImgDa

6、ta;       LPSTR                               lpPtr;       HLOCAL      

7、0;                hTempImgData;       LPBITMAPINFOHEADER    lpTempImgData;       LPSTR             &

8、#160;               lpTempPtr;       HDC                              

9、           hDc;       HFILE                              hf;    &

10、#160;  LONG                     x,y;       int                    

11、0;                      num;/用的是256级灰度图,不过只用到了0和255两种灰度级。       if( NumColors!=256)           MessageBox(hWnd,"Must be a mono bitm

12、ap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;/到位图数据的偏移值       OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);       /缓冲区大小       BufSize=OffBits+bi.biHeight*L

13、ineBytes;/为新图缓冲区分配内存       if(hTempImgData=LocalAlloc(LHND,BufSize)=NULL)            MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);      

14、;   return FALSE;           lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);           lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);       /新图缓冲区初始化为255memset(lpTempImgD

15、ata,(BYTE)255,BufSize);/拷贝头信息       memcpy(lpTempImgData,lpImgData,OffBits);       if(Hori)       /水平投影              for(y=0;y<bi.biHeight;y+)

16、                     lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);                     nu

17、m=0; /计数器初始化为0                     for(x=0;x<bi.biWidth;x+)                       

18、     if(*(lpPtr+)!=0) /是白点                                   num+; /计数器加1      &

19、#160;              lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);                     for(x=0;x<num;x+)  

20、;                          *(lpTempPtr+)=0; /在新图中,该行中共有num个黑点                    

21、;        else /垂直投影              for(x=0;x<bi.biWidth;x+)                     num=0; /计数器初始化为0 &#

22、160;                   lpPtr=(char *)lpImgData+(BufSize-LineBytes)+x;                     for(y=0;y<bi.biHe

23、ight;y+)                            if(*lpPtr!=0)                   &#

24、160;               num+; /计数器加1                            lpPtr-=LineBytes;   &

25、#160;                                      lpTempPtr=(char *)lpTempImgData+OffBits+x;      

26、;               for(y=0;y<num;y+)                            *lpTempPtr=0; /在新图中,该列中共有num个黑点

27、                            lpTempPtr+=LineBytes;                   &#

28、160;                      if(hBitmap!=NULL)           DeleteObject(hBitmap);       hDc=GetDC(hWnd);      

29、      /创立一个新的位图       hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+              NumColors*sizeof(RGBQU

30、AD),                                  (LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);       /起不同的结果文件名  

31、0;    if(Hori)              hf=_lcreat("c:hproject.bmp",0);       else              hf=_lcreat("c:vproject.bmp

32、",0);       _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER);        _lwrite(hf,(LPSTR)lpTempImgData,BufSize);       _lclose(hf);       /释放内存和资源     

33、; ReleaseDC(hWnd,hDc);       LocalUnlock(hTempImgData);       LocalFree(hTempImgData);       GlobalUnlock(hImgData);       return TRUE;8.2 差影法差影法的原理非常简单:将前后两幅图象相减,得到的差作为结果结果图象。图8.6

34、、图8.7、图8.8能够说明差影法的原理。图8.6     前景+背景图8.7     背景图8.8 图8.6、图8.7相减的结果图8.6是前景图(猫)加背景图(木星)。图8.7是背景图。图8.6减图8.7的结果如图8.8所示,这样就得到了前景(不完全是前景,因为背景的灰度值并不为零,但至少可以得到前景的形状)。差影法是非常有用的,比如说可以用在监控系统中。在银行金库内,摄像头每隔一小段时间,拍摄一幅图,与上一幅图做差影;如果差别超过了预先设置的阈值,说明有人,这时就应该拉响警报。我们在介绍灰度窗口变换时,曾经提到

35、了电影“阿甘正传”特技中应用了“蓝幕”技术,其实也包含了差影法的原理。以下是差影法的源程序。要注意的是,第一幅图的文件名为c:test.bmp,第二幅图的文件名是c:backgnd.bmp。它们有着相同的灰度值和调色板。执行时,这两个文件都已经准备好。我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。BOOL Subtraction(HWND hWnd)       DWORD          &

36、#160;              OffBits,BufSize;LPBITMAPINFOHEADER    lpImgData;       LPSTR                      

37、;      lpPtr;       HGLOBAL                  hSecond;       LPBITMAPINFOHEADER    lpSecondImgData;   

38、0;   LPSTR                            lpSecondPtr;       HLOCAL            

39、              hTempImgData;       LPBITMAPINFOHEADER    lpTempImgData;       LPSTR               

40、60;            lpTempPtr;       HDC                              hDc;  

41、0;    HFILE                     hf;       LONG                    

42、;        x,y;       int                           num,pos;/用的是256级灰度图,不过只用到了0和255两种灰度级。    

43、0;  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) /背景图没找到        &#

44、160; MessageBox(hWnd,"File c:backgnd.bmp not found!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;/到位图数据的偏移值       OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);       /缓冲区大小      

45、 BufSize=OffBits+bi.biHeight*LineBytes;       /为背景图的数据分配内存       if(hSecond=GlobalAlloc(GHND,BufSize)=NULL)            MessageBox(hWnd,"Error alloc memory!","Error Message",MB

46、_OK|MB_ICONEXCLAMATION);              _lclose(hf);         return FALSE;/指向该内存指针lpSecondImgData=(LPBITMAPINFOHEADER)GlobalLock(hSecond);/文件指针指到BITMAPINFOHEADER结构开始的地方     

47、0; _llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);       /读入头信息和位图数据       _lread(hf,(LPSTR)lpSecondImgData,BufSize);       _lclose(hf);       /为结果图缓冲区分配内存    

48、   if(hTempImgData=LocalAlloc(LHND,BufSize)=NULL)       MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);              GlobalUnlock(hSecond);

49、60;             GlobalFree(hSecond);return FALSE;     lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);           lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); 

50、      /新图缓冲区初始化为255memset(lpTempImgData,(BYTE)255,BufSize);/拷贝头信息       memcpy(lpTempImgData,lpImgData,OffBits);       for(y=0;y<bi.biHeight;y+)           &#

51、160;  pos=(BufSize-LineBytes-y*LineBytes);              /lpPtr指向第一幅图,lpSecondPtr指向第二幅图,lpTempPtr指向结果图              lpPtr=(char *)lpImgData+pos;   

52、0;          lpSecondPtr=(char *)lpSecondImgData+pos;              lpTempPtr=(char *)lpTempImgData+pos;              for(x=0;x

53、<bi.biWidth;x+)                     num=(unsigned char)*(lpPtr+);                     num-=(unsig

54、ned char)*(lpSecondPtr+);                     *(lpTempPtr+)=(unsigned char)fabs(num); /两者相减取绝对值,存入新图中                          if(hBitmap!=NULL)           DeleteObject(hBitmap);       hDc=GetDC(hWnd);       /创立一个新的位图       hBit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论