Zernike矩及其代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Zernike矩分类:图像矩2011-04-1919:22678人阅读评论(6)收藏举报Zernike在1934年引入了一组定义在单位圆上的复值函数集{},{}具有完备性和正交性,使得它可以表示定义在单位圆盘内的任何平方可积函数。其定义为:表示原点到点的矢量长度;表示矢量与轴逆时针方向的夹角。是实值径向多项式:称为Zernike多项式。Zernike多项式满足正交性:其中为克罗内克符号,是的共轭多项式。由于Zernike多项式的正交完备性,所以在单位圆内的任何图像都可以唯一的用下面式子来展开:式子中就是Zernike矩,其定义为:注意式子中和采用的是不同的坐标系(采用直角坐标,而采用的极坐标系,在计算的时候要进行坐标转换)对于离散的数字图像,可将积分形式改为累加形式:我们在计算一副图像的Zernike矩时,必须将图像的中心移到坐标的原点,将图像的像素点映射到单位圆内,由于Zernike矩具有旋转不变性,我们可以将作为图像的不变特征,其中图像的低频特征有p值小的提取,高频特征由p值高的提取。从上面可以看出,Zernike矩可以构造任意高阶矩。由于Zernike矩只具有旋转不变性,不具有平移和尺度不变性,所以要提前对图像进行归一化,我们采用标准矩的方法来归一化一副图像,标准矩定义为:,由标准矩我们可以得到图像的重心,我们将图像的重心移动到单位圆的圆心(即坐标的原点),便解决了平移问题。我们知道表征了图像的面积,归一图像的尺度无非就是把他们的大小变为一致的,(这里的大小指的是图像目标物的大小,不是整幅图像的大小,面积也是目标物的面积)。所以,对图像进行变换就可以达到图像尺寸一致的目的。综合上面结果,对图像进行变换,最终图像的Zernike矩就是平移,尺寸和旋转不变的。![endif]--Zernike不变矩相比Hu不变矩识别效果会好一些,因为他描述了图像更多的细节内容,特别是高阶矩,但是由于Zernike不变矩计算时间比较长,所以出现了很多快速的算法,大家可以google一下。用Zernike不变矩来识别手势轮廓,识别率大约在40%~50%之间,跟Hu不变矩一样,Zernike不变矩一般用来描述目标物形状占优势的图像,不适合用来描述纹理丰富的图像,对于纹理图像,识别率一般在20%~30%左右,很不占优势。C++代码如下:/*获取像素值psrcBmp:图像数据指针nsrcBmpWidth:图像宽度,以像素为单位x,y:像素点deep:图像的位数深度,(1表示8位的灰度图,3表示24位的RGB位图)*/COLORREFJ_getpixel(constBYTE*psrcBmp,constintnsrcBmpWidth,constintx,constinty,intdeep=3){if(deep==3){returnRGB(*(psrcBmp+x*3+y*bpl(nsrcBmpWidth,deep)+2),*(psrcBmp+x*3+y*bpl(nsrcBmpWidth,deep)+1),*(psrcBmp+x*3+y*bpl(nsrcBmpWidth,deep)+0));}elseif(deep==1){return*(psrcBmp+x+y*bpl(nsrcBmpWidth,deep));}}//获取标准矩(只支持8位灰度图)voidGetStdMoment(BYTE*psrcBmp,intnsrcBmpWidth,intnsrcBmpHeight,double*m){for(intp=0;p2;p++)for(intq=0;q2;q++){if(p==1&&q==1)break;for(inty=0;ynsrcBmpHeight;y++)for(intx=0;xnsrcBmpWidth;x++)m[p*2+q]+=(pow((double)x,p)*pow((double)y,q)*J_getpixel(psrcBmp,nsrcBmpWidth,x,y,1));}}//阶乘doubleFactorial(intn){if(n0)return-1;doublem=1;for(inti=2;i=n;i++){m*=i;}returnm;}//阶乘数,计算好方便用,提高速度doublefactorials[11]={1,1,2,6,24,120,720,5040,40320,362880,39916800};//把图像映射到单位圆,获取像素极坐标半径doubleGetRadii(intnsrcBmpWidth,intnsrcBmpHeight,intx0,inty0,intx,inty){doublelefttop=sqrt(((double)0-x0)*(0-x0)+(0-y0)*(0-y0));doublerighttop=sqrt(((double)nsrcBmpWidth-1-x0)*(nsrcBmpWidth-1-x0)+(0-y0)*(0-y0));doubleleftbottom=sqrt(((double)0-x0)*(0-x0)+(nsrcBmpHeight-1-y0)*(nsrcBmpHeight-1-y0));doublerightbottom=sqrt(((double)nsrcBmpWidth-1-x0)*(nsrcBmpWidth-1-x0)+(nsrcBmpHeight-1-y0)*(nsrcBmpHeight-1-y0));doublemaxRadii=lefttop;maxRadiirighttop?righttop:maxRadii;maxRadiileftbottom?leftbottom:maxRadii;maxRadiirightbottom?rightbottom:maxRadii;doubleRadii=sqrt(((double)x-x0)*(x-x0)+(y-y0)*(y-y0))/maxRadii;if(Radii1){Radii=1;}returnRadii;}//把图像映射到单位圆,获取像素极坐标角度doubleGetAngle(intnsrcBmpWidth,intnsrcBmpHeight,intx,inty){doubleo;doubledia=sqrt((double)nsrcBmpWidth*nsrcBmpWidth+nsrcBmpHeight*nsrcBmpHeight);intx0=nsrcBmpWidth/2;inty0=nsrcBmpHeight/2;doublex_unity=(x-x0)/(dia/2);doubley_unity=(y-y0)/(dia/2);if(x_unity==0&&y_unity=0)o=pi/2;elseif(x_unity==0&&y_unity0)o=1.5*pi;elseo=atan(y_unity/x_unity);if(o*y0)//第三象限o=o+pi;returno;}//Zernike不变矩J_GetZernikeMoment(BYTE*psrcBmp,intnsrcBmpWidth,intnsrcBmpHeight,double*Ze){doubleR[count][count]={0.0};doubleV[count][count]={0.0};doubleM[4]={0.0};GetStdMoment(psrcBmp,nsrcBmpWidth,nsrcBmpHeight,M);intx0=(int)(M[2]/M[0]+0.5);inty0=(int)(M[1]/M[0]+0.5);for(intn=0;ncount;n++){for(intm=0;mcount;m++){//优化算法,只计算以下介数if((n==1&&m==0)||(n==1&&m==1)||(n==2&&m==0)||(n==2&&m==1)||(n==2&&m==2)||(n==3&&m==0)||(n==3&&m==1)||(n==3&&m==2)||(n==3&&m==3)||(n==4&&m==0)||(n==4&&m==1)||(n==4&&m==2)||(n==4&&m==3)||(n==4&&m==4)){for(inty=0;ynsrcBmpHeight;y++){for(intx=0;xnsrcBmpWidth;x++){for(ints=0;(s=(n-m)/2)&&n=m;s++){R[n][m]+=pow(-1.0,s)*(n-s10?Factorial(n-s):factorials[n-s])*pow(GetRadii(nsrcBmpWidth,nsrcBmpHeight,x0,y0,x,y),n-2*s)/((s10?Factorial(s):factorials[s])*((n+m)/2-s10?Factorial((n+m)/2-s):factorials[(n+m)/2-s])*((n-m)/2-s10?Factorial((n-m)/2-s):factorials[(n-m)/2-s]));}Ze[n*count+m]+=R[n][m]*J_getpixel(psrcBmp,nsrcBmpWidth,x,y,1)*cos(m*GetAngle(nsrcBmpWidth,nsrcBmpHeight,x,y));//实部V[n][m]+=R[n][m]*J_getpixel(psrcBmp,nsrcBmpWidth,x,y,1)*sin(m*GetAngle(nsrcBmpWidth,nsrcBmpHeight,x,y));//虚部R[n][m]=0.0;}}*(Ze+n*count+m)=sqrt((*(Ze+n*count+m))*(*(Ze+n*count+m))+V[n][m]*V[n][m])*(n+1)/pi/M[0];}}}}

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功