资源简介
基于图像Hu不变矩及图像的欧氏距离对二值图像进行分类
代码片段和文件信息
#include
#include
#include
#include
#include
#include //itoa
#pragma comment(lib“cv.lib“)
#pragma comment(lib“highgui.lib“)
void gethuju(char * filenamedouble *Huju)//Huju[7]为hu不变距
{
IplImage *myimg;
myimg = cvLoadImage(filename0);///////////////
double M[4][4];
double u00u20u02u11u12u21u30u03;//归一化中心距
int ijxy;
double x0y0;//x0,y0图像质心
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
M[i][j]=0;
if(i+j<4)
{
for(x=0;xwidth;x++)
for(y=0;yheight;y++)
M[i][j]=M[i][j]+((unsigned char*)(myimg->imageData + myimg->widthStep*y))[x]*pow((x+1)i)*pow((y+1)j);//计算M
}
}
x0=M[1][0]/M[0][0];
y0=M[0][1]/M[0][0];
u00=M[0][0];
u20=(M[2][0]-x0*M[1][0])/pow(u002);
u02=(M[0][2]-y0*M[0][1])/pow(u002);
u11=(M[1][1]-x0*M[0][1])/pow(u002);
u21=(M[2][1]-2*x0*M[1][1]-y0*M[2][0]+2*x0*x0*M[0][1])/pow(u002.5);
u12=(M[1][2]-2*y0*M[1][1]-x0*M[0][2]+2*y0*y0*M[1][0])/pow(u002.5);
u30=(M[3][0]-3*x0*M[2][0]+2*x0*x0*M[1][0])/pow(u002.5);
u03=(M[0][3]-3*y0*M[0][2]+2*y0*y0*M[0][1])/pow(u002.5);
Huju[0]=u20+u02;
Huju[1]=(u20-u02)*(u20-u02)+4*u11*u11;
Huju[2]=(u30-3*u12)*(u30-3*u12)+(3*u21-u03)*(3*u21-u03);
Huju[3]=(u30+u12)*(u30+u12)+(u21+u03)*(u21+u03);
Huju[4]=(u30-3*u12)*(u30+u12)*((u30+u12)*(u30+u12)-3*(u21+u03)*(u21+u03))+(3*u21-u03)*(u21+u03)*(3*(u30+u12)*(u30+u12)-(u21+u03)*(u21+u03));
Huju[5]=(u20-u02)*((u30+u12)*(u30+u12)-(u21+u03)*(u21+u03))+4*u11*(u30+u12)*(u21+u03);
Huju[6]=(3*u21-u03)*(u30+u12)*((u30+u12)*(u30+u12)-3*(u21+u03)*(u21+u03))+(3*u12-u30)*(u21+u03)*(3*(u30+u12)*(u30+u12)-(u21+u03)*(u21+u03));
}
void main(void)
{
char bmp[5]=“.bmp“filename1[20]=“bat“filename2[20]=“flatfish“filename3[20]=“hammer“filename4[20]=“key“filename[20];
int ij;
char str[3];
double Huju[7];
double bat0[7]flatfish0[7]hammer0[7]key0[7];//基准hu距
double juli1juli2juli3juli4;
gethuju(“bat0.bmp“bat0);
gethuju(“flatfish0.bmp“flatfish0);
gethuju(“hammer0.bmp“hammer0);
gethuju(“key0.bmp“key0);
for(i=0;i<7;i++)
cout< for(i=1;i<11;i++)
{
for(j=0;j<20;j++)
filename[j]=filename1[j];
itoa(istr10);
strcat(filenamestr);
strcat(filenamebmp);
// cout< gethuju(filenameHuju);
juli1=0;//初始化
juli2=0;
juli3=0;
juli4=0;
for(j=0;j<7;j++)
{
juli1=juli1+(bat0[j]-Huju[j])*(bat0[j]-Huju[j]);//
juli2=juli2+(flatfish0[j]-Huju[j])*(flatfish0[j]-Huju[j]);
juli3=juli3+(hammer0[j]-Huju[j])*(hammer0[j]-Huju[j]);
juli4=juli4+(key0[j]-Huju[j])*(key0[j]-Huju[j]);
}
if (juli1 cout<<“bat“< else if (juli2<
评论
共有 条评论