// HuMoment.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
#include "math.h"
using namespace std;
float MOMENTS_M(const IplImage* MAT,int p,int q) //空间距
{
CvScalar scl;
float M_sum_y=0;
float M_sum_xy=0;
int H,W;
H=MAT->height;
W=MAT->width;
for(int i=0;i<H;i++)
{
for(int j=0;j<W;j++)
{
scl=cvGet2D(MAT,i,j);//读取当前像素的灰度值
M_sum_y+=scl.val[0]*pow((float)j,q);//行处理
}
M_sum_xy+=pow((float)i,p)*M_sum_y;//列处理
}
return M_sum_xy;//返回空间矩
}
float MOMENTS_U(const IplImage* MAT,int p,int q,float X_,float Y_) //中心距
{
CvScalar scl;
float N_sum_y=0;
float N_sum_xy=0;
int H,W;
H=MAT->height;
W=MAT->width;
for(int i=0;i<H;i++)
{
for(int j=0;j<W;j++)
{
scl=cvGet2D(MAT,i,j);//读取序列的灰度值
N_sum_y+=scl.val[0]*pow(j-Y_,q);
}
N_sum_xy+=pow(i-X_,p)*N_sum_y;
}
return N_sum_xy;//返回中心矩
}
//归一化的中心距
int main(int argc, CHAR* argv[])
{
int M00,M01,M10,M11,M02,M20,M12,M21,M03,M30;
float X_,Y_;
float U00,U02,U20,U11,U03,U30,U21,U12;
float N02,N20,N11,N03,N30,N12,N21;
float H1,H2,H3,H4,H5,H6,H7;
//IplImage* img;
IplImage* mat;
mat=cvLoadImage("0.jpg",0);
if(mat==NULL)
return -1;
M00=MOMENTS_M(mat,0,0);
M01=MOMENTS_M(mat,0,1);
M10=MOMENTS_M(mat,1,0);
M11=MOMENTS_M(mat,1,1);
M02=MOMENTS_M(mat,0,2);
M20=MOMENTS_M(mat,2,0);
M12=MOMENTS_M(mat,1,2);
M21=MOMENTS_M(mat,2,1);
M03=MOMENTS_M(mat,0,3);
M30=MOMENTS_M(mat,3,0);
X_=M10/M00;
Y_=M01/M00;
U00=M00;
U02=M02-M01*Y_;
U20=M20-M10*X_;
U11=M11-M10*Y_;
U03=M03-3*M02*X_+2*M10*X_*X_;
U30=M30-3*M02*Y_+2*M01*Y_*Y_;
U12=M12-2*M11*Y_-M02*X_+2*M10*Y_*Y_;
U21=M21-2*M11*X_-M20*Y_+2*M01*X_*X_;
N02=U02/U00/U00;
N20=U20/U00/U00;
N11=U11/U00/U00;
N03=U03/U00/U00/sqrt(U00);
N30=U30/U00/U00/sqrt(U00);
N12=U12/U00/U00/sqrt(U00);
N21=U21/U00/U00/sqrt(U00);
//hu7个不变距
H1=N20+N02;
H2=(N20-N02)* (N20-N02)+4*N11*N11;
H3=(N30-3*N12)* (N30-3*N12)+(3*N21-N03)* (3*N21-N03);
H4=(N30+N12)* (N30+N12)+(N21+N03)* (N21+N03);
H5=((N30-3*N12)*(N30+N12)*((N30+N12)*(N30+N12)-3*(N21+N03)*(N21+N03))
+(3*N21-N03)*(N21+N03)*(3*(N30+N12)* (N30+N12)-(N21+N03)* (N21+N03)))*100000;
H6=(N20-N02)*((N30+N12)* (N30+N12)-(N21+N03)* (N21+N03))
+4*N11*(N30+N12)*(N21+N03);
H7=((3*N21-N03)*(N30+N12)*((N30+N12)*(N30+N12)-3*(N21+N03)*(N21+N03))
+(3*N12-N30)*(N21+N03)*(3*(N30+N12)* (N30+N12)- (N21+N03)* (N21+N03)))*100000;
H1 =fabs(log(fabs(H1)));
H2 =fabs(log(fabs(H2)));
H3 =fabs(log(fabs(H3)));
H4 =fabs(log(fabs(H4)));
H5 =fabs(log(fabs(H5)));
H6 =fabs(log(fabs(H6)));
H7 =fabs(log(fabs(H7)));
cout<<"H1="<<H1<<endl;
cout<<"H2="<<H2<<endl;
cout<<"H3="<<H3<<endl;
cout<<"H4="<<H4<<endl;
cout<<"H5="<<H5<<endl;
cout<<"H6="<<H6<<endl;
cout<<"H7="<<H7<<endl;
return 0;
}
seven-Hu.zip_hu不变距_旋转 不变距
版权申诉
60 浏览量
2022-09-22
22:04:08
上传
评论
收藏 2.41MB ZIP 举报
![avatar](https://profile-avatar.csdnimg.cn/5df8bff20ad645abb899a1a8333a748d_weixin_42651281.jpg!1)
小波思基
- 粉丝: 74
- 资源: 1万+
评论0