利用图像的不变矩特征进行图像匹配是一种基于特征的图像匹配方式,它通过计算两幅图的不变矩特征,然后再计算这两组特征的相似度来判断两幅图是否匹配。
这里利用图像的二阶和三阶矩来导出7个不变矩,这些特征在比例因子小于2和旋转角度不超过45度的条件下,对于平移,旋转,比例因子的变化都是不变的,它反映了图像的固有特性。这7个不变矩的计算公式可以看下面的程序,公式确实写的累啊。
opencv实现的代码如下:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include "highgui.h"
#include <math.h>
typedef unsigned long uint32;
typedef unsigned int uint16;
typedef unsigned char uint8;
IplImage *src_gray1, *src_gray2, *src_gray3;
IplImage *temp_gray1, *temp_gray2, *temp_gray3;
CvPoint CalImageCenter( IplImage* I ) //单通道图像,计算图像重心位置
{
CvPoint CenterPosition;
double m10=0;
double m00=0;
double m01=0;
int i,j;
for ( i=0; i<I->height; i++ )
{
uint8* ptr = (uint8*)( I->imageData + i*I->widthStep );
for ( j=0; j<I->width; j++ )
{
uint8 Pixel = ptr[j];
m10 += (j)*Pixel;
m00 += Pixel;
m01 += (i)*Pixel;
}
}
CenterPosition.x = m10/m00;
CenterPosition.y = m01/m00;
return CenterPosition;
}
double CalCenterMoment( IplImage* I, int CenterX, int CenterY, int ip, int jp ) //计算图像的中心矩
{
int i,j;
double ICenterMoment=0;
for ( i=0; i<I->height; i++ )
{
uint8* ptr = (uint8*)( I->imageData + i*I->widthStep );
for ( j=0; j<I->width; j++ )
{
uint8 Pixel = ptr[j];
double temp; //中间值