第八讲 图象的检测,
匹配
第八讲 图象的检测,模板匹配
图象的分割与检测(识别)实际上是一项非常困难的工作。很难说清楚为什么图象应该分割成这样而不是那样。人类的视觉系统是非常优越的 ,它不仅包含了双眼,还包括了大脑,可以从很复杂的景物中分开并识别每个物体,甚至可以毫不费力的跟上每秒好几十帧变化的图象。举两个例子来说明一下人类视觉系统的优越性:
图1. 单词THE
图2. 看不见的三角
图1是单词THE,这一点很容易看出来,但仔细观察一下,就会发现,图中少了很多线条。在我们人类看来很简单的一件事,让计算机来做就很困难了。
图2中尽管没有任何线条,但我们还是可以很容易的看出中间存在着一个白色三角形。计算机却很难发现。
由于人类在观察图象中应用了大量的知识,所以没有任何一台计算机在分割和检测真实图象时,能达到人类视觉系统的水平。正因为如此,对于大部分图象应用来说,自动分割与检测还是一个将来时,目前只有少数的几个领域(如印刷体识别OCR)自动识别达到了实用的水平。
也许算是题外话,我们可以憧憬这样一种应用:基于内容的搜索。在一场足球比赛的录象中,用户可以输入命令,由计算机自动搜索出所有射门的镜头并显示在屏幕上。目前,我们能从一幅图象中获得的信息只是每个像素的颜色或灰度值,除此以外别无其它,完成上述功能实在是太困难了。所以说解决图象分割和检测最根本的方法是在编码(成像)时就给予考虑。这也正是MPEG4及未来的视频压缩编码
的主要工作。
正因为有上述的困难,
所以我们今天要介绍的只是一些最基本,最简单的算法和思想,针对也只能是一些具体(而不是通用)的应用。算法共有三个:投影法,差影法和模板匹配。
1. 投影法
在介绍投影法之前,我先出一道题目,下面的这幅照片是著名的华盛顿纪念碑(我记得在“阿甘正传”中曾经看到过它),怎样从图中自动检测到水平方向上纪念碑的位置。
图3. 华盛顿纪念碑
仔细观察,不难发现,纪念碑上像素的灰度都差不多而且与众不同,如果我们选取合适的阈值,做削波处理(这里选175到220),将该图二值化,如下图所示:
图4. 削波处理,将图3二值化
图5. 图4做竖直方向投影
由于纪念碑所在的那几列的白色点比起其他列多很多,如果把该图在竖直方向做投影,如下图所示:其中,黑色线条的高度代表了该列上白色点的个数。图中间的高峰部分就是我们要找的水平方向上纪念碑所在的位置,这就是投影法。
可以看出投影法是一种很自然的想法,有点象灰度直方图。为了得到更好的效果,投影法经常和阈值化一起使用。由于噪声点对投影有一定的影响,所以处理前最好先做一次平滑,去除噪声。
以下是投影法的源程序,第二个参数是个BOOL变量,为真时表示在水平方向上做投影,否则在竖直方向上做投影。要注意的是,我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。
BOOL Projection(HWND hWnd,BOOL Hori)
{
DWORD
OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR
l
r;
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 with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//到位图数据的偏移值
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//缓冲区大小
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
//为新图缓冲区分配内存
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//新图缓冲区初始化为255
memset(lpTempImgData,(BYTE)255,BufSize);
//拷贝头信息
memcpy(lpTempImgData,lpImgData,OffBits);
if(Hori)
{
//水平投影
for(y=0;y
目录下为本章介绍的源程序,功能是图象的检测,模板匹配
运行时,文件c:\test.bmp必须存在
命令行编译过程如下
vcvars32
rc bmp.rc
cl detect.c bmp.res user32.lib gdi32.lib
phoenix的Photoshop
- 8 -
_993504227.doc
_993504412.doc
_993504456.doc
_993504193.doc