模板匹配之zernike矩
2014-12-18 16:41
281 查看
zernike矩具有旋转不变性,广泛用于目标识别模板匹配,抗噪能力强。
zernike矩的原理就不过多赘述,上代码。
//求n的阶乘
long TemplateMatch::factorial(int n)
{
int result=1;
while(n>1)
{
result *= n;
n-=1;
}
return result;
}
//zernike矩径向多项式
double TemplateMatch::RadialPolynomial(double p, int n, int m)
{
double radial=0;
int s;
double c;
for (s=0; s<=(n-m)/2; s++)
{
c=pow((double)(-1),(double)(s))*factorial(n-s)/((double)(factorial(s)*factorial((n+m)/2-s)*factorial((n-m)/2-s)));
radial=radial+c*pow(p,n-2*s);
}
return radial;
}
//n阶m次zernike矩
double TemplateMatch::ZernikeMoments(double *im,int imW,int imH, int n, int m)
{
#define im(ROW,COL) im[imW*(ROW)+(COL)]
double zr=0;
double zi=0;
int cnt=0;
int x,y;
double p;
double radial=0;
double theta=0;
for (y=0; y<imH; y++)
{
for(x=0; x<imW; x++)
{
p=sqrt((double)((2*x-imW+1)*(2*x-imW+1)+(imH-1-2*y)*(imH-1-2*y)))/imW;
if (p<=1)
{
radial=RadialPolynomial(p,n,m);
theta=atan2((double)(imH-1-2*y),(double)(2*x-imW+1));
zr+=im(y,x)*radial*cos(m*theta);
zi+=im(y,x)*radial*sin(m*theta);
cnt++;
}
}
}
double A=(n+1)*sqrt((double)(zr*zr+zi*zi))/cnt;
return A;
}
zernike矩的原理就不过多赘述,上代码。
//求n的阶乘
long TemplateMatch::factorial(int n)
{
int result=1;
while(n>1)
{
result *= n;
n-=1;
}
return result;
}
//zernike矩径向多项式
double TemplateMatch::RadialPolynomial(double p, int n, int m)
{
double radial=0;
int s;
double c;
for (s=0; s<=(n-m)/2; s++)
{
c=pow((double)(-1),(double)(s))*factorial(n-s)/((double)(factorial(s)*factorial((n+m)/2-s)*factorial((n-m)/2-s)));
radial=radial+c*pow(p,n-2*s);
}
return radial;
}
//n阶m次zernike矩
double TemplateMatch::ZernikeMoments(double *im,int imW,int imH, int n, int m)
{
#define im(ROW,COL) im[imW*(ROW)+(COL)]
double zr=0;
double zi=0;
int cnt=0;
int x,y;
double p;
double radial=0;
double theta=0;
for (y=0; y<imH; y++)
{
for(x=0; x<imW; x++)
{
p=sqrt((double)((2*x-imW+1)*(2*x-imW+1)+(imH-1-2*y)*(imH-1-2*y)))/imW;
if (p<=1)
{
radial=RadialPolynomial(p,n,m);
theta=atan2((double)(imH-1-2*y),(double)(2*x-imW+1));
zr+=im(y,x)*radial*cos(m*theta);
zi+=im(y,x)*radial*sin(m*theta);
cnt++;
}
}
}
double A=(n+1)*sqrt((double)(zr*zr+zi*zi))/cnt;
return A;
}
相关文章推荐
- Castle ActiveRecord 应用 Expression.Example 模板对象匹配查询
- HDU 2444 The Accomodation of Students(最大二分匹配(匈牙利算法)+二分图判断->模板题目)
- Halcon学习之基于形状的模板匹配(一)
- 杭电-1179 魔法师与魔法棒(二分匹配模板)
- dfs,bfs的二分匹配模板(模板题hdu1150)
- UOJ#80 二分图最大权匹配 [模板题]
- 模板匹配-2
- Matlab模板匹配实现图像运动估计(频域实现)
- 图像相似度测量和模板匹配方法
- opencv——模板匹配
- 用python玩微信跳一跳系列-小人识别之模板匹配
- QT实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配
- halcon模板匹配学习(一) Matching 初印象
- halcon模板匹配学习(二) 准备模板
- NYOJ 237 NYOJ 239 二分图 最大匹配模板题 游戏高手的烦恼 月老的难题 两个题一样
- EmguCV Image类中的函数(四)使用MatchTemplate函数进行模板匹配
- HALCON模板匹配
- 基于金字塔的模板匹配算法
- HDU 2426 Interesting Housing Problem 二分匹配(KM模板)或者最小费用最大流
- 模板匹配