vc++数字图像运动检测处理系统 第7页

vc++数字图像运动检测处理系统 第7页
图像特征区域的确定
要想进行图像的匹配,必须要先确定一块用来匹配的区域,因为不可能把两幅图像的所有像素进行比较,那样计算量太大,系统开销不允许。如何抽取特征区域也是相当重要的。如果特征找的不对,图像匹配就不可能准确。从一个图片中提取什么样的特征,将因不同的模式而异。特定区域的确定要先人为的设定判断条件。在这种情况下,不能用像素点与点之间的距离,也不是点与一组点间的距离,而是一个统计距离。在本系统中,把像素点数值总数最大的一块区域作为特征区域(在进行这个操作之前必须已经进行了求梯度的操作)。因为这样的特征区域中的像素点数值变化明显,更加容易进行匹配,有利于减少误差。
图像特征区域确定的函数IocateImporntpoint:
void DIB::LocateImporntPoint(HANDLE hDIB, int Radius, CPoint *pPoint)
{
 LPBITMAPINFOHEADER lpbi;
 lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
 int width ,height;
 width = lpbi->biWidth;
 height = lpbi->biHeight;
 WORD wBytesPerLine;
 wBytesPerLine = this->BytePerLine(hDIB);
 LPBYTE lpData;
 lpData = this->FindDIBBits(hDIB);
 int tempsum=0,sum=0;//定义两个变量用来记数
 long lOffset;
 //扫描整个图片(边缘点除外)寻找特征区域
 for(int i=Radius;i<height-Radius;i++)
  for(int j= Radius;j<width-Radius;j++)
  { tempsum =0;
   //扫描以Radius×2+1为边长的正方形区域
   for(int k1=-Radius;k1<=Radius;k1++)
    for(int k2 =-Radius;k2<=Radius;k2++)
    { 
     lOffset = this->PixelOffset(i+k1,j+k2,wBytesPerLine);
     int color = *(lpData+lOffset);
     tempsum +=color;//累加象素值
    }
    if(tempsum>sum)//如果得到的累计象素值大于已经得到的最大值
    { 
     //更改累计象素值大小
     sum = tempsum;
     //更改特征区域中心点
     (pPoint->x) = j;
     (pPoint->y) = i;    
}
  }
 //下面的代码把特征区域的边框设置成白色
 for( i = -Radius;i<=Radius;i++)
 {
  lOffset = this->PixelOffset(pPoint->y-Radius,pPoint->x +i,wBytesPerLine);
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
 }
 for( i = -Radius;i<=Radius;i++)
 {
  lOffset = this->PixelOffset(pPoint->y+Radius,pPoint->x +i,wBytesPerLine);
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
 }
 for( i = -Radius;i<=Radius;i++)
 {
  lOffset = this->PixelOffset(pPoint->y+i,pPoint->x-Radius ,wBytesPerLine);
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
 }
 for( i = -Radius;i<=Radius;i++)
 {
  lOffset = this->PixelOffset(pPoint->y+i,pPoint->x+Radius,wBytesPerLine);
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
  *(lpData+lOffset++) = 255;
 }
 lOffset = this->PixelOffset(pPoint->y,pPoint->x ,wBytesPerLine);
 *(lpData+lOffset++) = 0;
 *(lpData+lOffset++) = 255;
 *(lpData+lOffset++) = 0;
  GlobalUnlock(hDIB);}
图像特征区域确定后,用白框框起来的部分为图片特征区域如图13所示。
图13 特征区域确定图
(6)得到特征区域的颜色信息
定位出特征区域的位置时,处理的是求了梯度之后的图像,而后面的运动检测要求使用原来图像的彩色区域信息,所以光有了区域位置还不行,必须得到该区域具体像素点的颜色信息。在系统实现的时候是把特征区域的颜色信息存放到一个数组里面,这样后面要用它的时候只要查询数组就够了,相对于查询整个源图像来说,可以大大地节省计算时间。得到特征区域颜色信息的函数OnMenuTezhengquyu(参见源程序)。特征区域的颜色信息如图14所示。
图14 特征区域的颜色信息
(7)两幅图像的匹配
图像的匹配,简单的说就是进行两幅图像的相似程度的判断。一般来说,要比较的两幅图像的大小(长宽)是相等的,需要判定的只是图像内容的相似情况。系统实现图像匹配的时候,已经进行了图像特征区域的提取,因此在进行匹配的时候,图像对齐已经不成问题了。
具体实现的方法为:先把两个图像的特征区域的中心点对齐,然后根据两个中心点在各自图像中的偏差,来确定要比较的像素。接着处理那些要进行比较的像素,得到它们的差值 的绝对值,最后累加这些绝对值,观察它的大小,如果绝对值非常大,说明两幅图像的差异很大,就认为不能匹配,否则就认为匹配成功。
在求的一幅图片的特征区域之后,就要把这幅图片和第二幅图片进行比较,分析两幅图片的相似程度如何,如果很相似,说明图片上面没有运动物体,可以把其中的一幅图片设定为背景(当然也可以根据需要多比较几幅图片)。
注意:把第一幅图片和第二幅图片进行比较的时候,第二幅图片同样要进行中值滤波处理。如果第二幅图片上面没有第一幅图片上面的特征区域,那就说明两幅图片是完全不同的,系统直接返回去检查下一幅图片。如果第二幅图片上面有第一幅图片上面的特征区域,那么系统将根据两个特征区域在各自图片中的相对位置,进行图片相似度的比较。成功则确定背景,不成功则查看下一幅图片

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有