视觉图像:模板匹配二
来源:网络收集 点击: 时间:2024-05-22相似性度量:归一化相关系数匹配法:
其公式如下所示:
进行变换得;
其中,I为待匹配图像;M为匹配图像;
m和n分别为匹配图像的宽度和长度;
N=m×n;
r的值域范围在,值为1.0表示待匹配图像和匹配图像完全匹配

代码编写:
先把公式中各分量的计算公式写成函数,总共有5个;
//∑∑M(i,j)
double MFun(Mat _mask_img)
{
int _width = _mask_img.cols;
int _height = _mask_img.rows;
double m_sum = 0.f;
unsigned char* p_data = (unsigned char*)_mask_img.data;
for (int j=0;j_width;j++)//lie
{
for (int i=0;i_height;i++)//hang
{
m_sum = p_data;
}
}
return m_sum;
}

//∑∑M(i,j)^2
double M2Fun(Mat _mask_img)
{
int _width = _mask_img.cols;
int _height = _mask_img.rows;
double m_sum = 0.f;
unsigned char* p_data = (unsigned char*)_mask_img.data;
for (int j=0;j_width;j++)
{
for (int i=0;i_height;i++)
{
double p_data_1 = p_data;
m_sum = p_data_1 * p_data_1;
}
}
return m_sum;
}

//∑∑I(i,j)
double IFun(Mat _raw_img,Mat _mask_img,int _u,int _v)
{
double m_sum;
unsigned char* p_data = (unsigned char*)_raw_img.data;
int _height = _mask_img.rows;
int _width = _mask_img.cols;
for (int j=0;j_width;j++)
{
for (int i=0;i_height;i++)
{
m_sum = p_data;
}
}
return m_sum;
}

//∑∑I(i,j)^2
double I2Fun(Mat _raw_img,Mat _mask_img,int _u,int _v)
{
double m_sum;
unsigned char* p_data = (unsigned char*)_raw_img.data;
int _height = _mask_img.rows;
int _width = _mask_img.cols;
for (int j=0;j_width;j++)
{
for (int i=0;i_height;i++)
{
double temp_data = p_data;
m_sum = temp_data * temp_data;
}
}
return m_sum;
}

//∑∑IM
double IMFun(Mat _raw_img,Mat _mask_img,int _u,int _v)
{
double m_sum;
unsigned char* p_data_1 = (unsigned char*)_raw_img.data;
unsigned char* p_data_2 = (unsigned char*)_mask_img.data;
int _height = _mask_img.rows;
int _width = _mask_img.cols;
for (int j=0;j_width;j++)
{
for (int i=0;i_height;i++)
{
m_sum = p_data_1 * p_data_2;
}
}
return m_sum;
}

匹配结果值进行保存,
程序如下:
Mat MaskMatchFun(Mat _raw_img,Mat _mask_img)
{
int mask_width = _mask_img.cols;
int mask_height = _mask_img.rows;
int mask_big = mask_width * mask_height;//m*n
int raw_width = _raw_img.cols;
int raw_height = _raw_img.rows;
int real_height = raw_height - mask_height + 1;//l-m+1
int real_width = raw_width - mask_height + 1;
double M_Value = MFun(_mask_img);//m
double M2_Value = M2Fun(_mask_img);//m^2
Mat dist_img(real_height,real_width,CV_32FC1);
float* p_data = (float*) dist_img.data;
for (int j=0;jreal_width;j++)
{
for (int i=0;ireal_height;i++)
{
double temp1 = IMFun(_raw_img,_mask_img,i,j);
double temp2 = IFun(_raw_img,_mask_img,i,j);
double fenzi = mask_big*temp1-temp2*M_Value;
double temp3 = I2Fun(_raw_img,_mask_img,i,j);
double temp4 = (mask_big*temp3-temp2*temp2)*(mask_big*M2_Value-M_Value*M_Value);
double fenmu = sqrt(temp4);
p_data = fenzi/fenmu;
}
}
return dist_img;
}

版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.1haoku.cn/art_827574.html