摘要
本文主要总结了进行目标跟踪、检测中经常使用到的图像相似度测量和模板匹配方法,并给出了具体的基于OpenCV的代码实现。
引言
模板匹配是一种在源图像中寻找与图像patch最相似的技术,常常用来进行目标的识别、跟踪与检测。其中最相似肯定是基于某种相似度准则来讲的,也就是需要进行相似度的测量。另外,寻找就需要在图像上进行逐行、逐列的patch窗口扫描,当然也不一定需要逐行逐列的扫描,当几个像素的误差比计算速度来的不重要时就可以设置扫描的行列步进值,以加快扫描和计算的时间消耗。下面就对相似度测量和模板匹配进行介绍(所有的图像都假定是灰度图)。
正文
图像相似度测量
直方图方法
方法描述:有两幅图像patch(当然也可是整幅图像),分别计算两幅图像的直方图,并将直方图进行归一化,然后按照某种距离度量的标准进行相似度的测量。
方法的思想:基于简单的向量相似度来对图像相似度进行度量。
优点:直方图能够很好的归一化,比如256个bin条,那么即使是不同分辨率的图像都可以直接通过其直方图来计算相似度,计算量适中。比较适合描述难以自动分割的图像。
缺点:直方图反应的是图像灰度值得概率分布,并没有图像的空间位置信息在里面,因此,常常出现误判;从信息论来讲,通过直方图转换,信息丢失量较大,因此单一的通过直方图进行匹配显得有点力不从心。
基于opencv的实现,我把它封装为函数(输入输出都是灰度图像,且设定的灰度级为8,及0-255),有需要的可以直接拿去使用
<span style="font-size:18px;"><span style="font-size:18px;">double getHistSimilarity(const Mat& I1, const Mat& I2)
{
int histSize = 256;
float range[] = {0,256};
const float* histRange = {range};
bool uniform = true;
bool accumulate = false;
Mat hist1,hist2;
calcHist(&I1,1,0,Mat(),hist1,1,&histSize,&histRange,uniform,accumulate);
normalize(hist1,hist1,0,1,NORM_MINMAX,-1,Mat());
calcHist(&I2,1,0,Mat(),hist2,1,&histSize,&histRange,uniform,accumulate);
normalize(hist2,hist2,0,1,NORM_MINMAX,-1,Mat());
return compareHist(hist1, hist2, CV_COMP_CORREL);
}</span></span>
其中直方图比较的方法在opencv中的实现的有:
/* Histogram comparison methods */
enum
{
CV_COMP_CORREL =0,
CV_COMP_CHISQR =1,
CV_COMP_INTERSECT =2,
CV_COMP_BHATTACHARYYA =3,
CV_COMP_HELLINGER =CV_COMP_BHATTACHARYYA
};
分别是:相关度,卡方,相交系数和巴氏距离,其计算公式如下图所示:
<