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)两幅图像的匹配
图像的匹配,简单的说就是进行两幅图像的相似程度的判断。一般来说,要比较的两幅图像的大小(长宽)是相等的,需要判定的只是图像内容的相似情况。系统实现图像匹配的时候,已经进行了图像特征区域的提取,因此在进行匹配的时候,图像对齐已经不成问题了。
具体实现的方法为:先把两个图像的特征区域的中心点对齐,然后根据两个中心点在各自图像中的偏差,来确定要比较的像素。接着处理那些要进行比较的像素,得到它们的差值 的绝对值,最后累加这些绝对值,观察它的大小,如果绝对值非常大,说明两幅图像的差异很大,就认为不能匹配,否则就认为匹配成功。
在求的一幅图片的特征区域之后,就要把这幅图片和第二幅图片进行比较,分析两幅图片的相似程度如何,如果很相似,说明图片上面没有运动物体,可以把其中的一幅图片设定为背景(当然也可以根据需要多比较几幅图片)。
注意:把第一幅图片和第二幅图片进行比较的时候,第二幅图片同样要进行中值滤波处理。如果第二幅图片上面没有第一幅图片上面的特征区域,那就说明两幅图片是完全不同的,系统直接返回去检查下一幅图片。如果第二幅图片上面有第一幅图片上面的特征区域,那么系统将根据两个特征区域在各自图片中的相对位置,进行图片相似度的比较。成功则确定背景,不成功则查看下一幅图片