www.pudn.com > zernike1.rar > zernike.m
function [ord,repet,Zernike_mag]=zernike(a,order)
%##########################################################################
%------------------------------- 计算Zernike矩 ---------------------------%
%##########################################################################
a=im2double(a); % 必须将图像转化为double型
% figure,imshow(a)
[Nmax,Nmax]=size(a);
% ------ 首先计算常规矩m00 对图像进行标准化 ------%
% beta=800; %beta为一个预先设定的值
% m00=0;
% for x=1:Nmax
% for y=1:Nmax
% m00=m00+a(x,y);
% end
% end
% factor=sqrt(beta/m00);
% a=imresize(a,factor,'bilinear');
% [Nmax,Nmax]=size(a);
x = -1:2/(Nmax-1):1;
[X,Y] = meshgrid(x,x);
[theta,r] = cart2pol(X,Y); %直角坐标转化为极坐标
idx = r<=1;%限定了计算的范围,即单位圆内
% z = nan(size(X));
%ORDER=10; %最高阶数
ORDER=order;
num=0;
for N=0:ORDER % 从0阶开始计算
for M=-N:N
if (mod(N-abs(M),2)==0) %判断是否满足约束条件,满足则计算该矩
n(num+1)=N;
m(num+1)=M;
num=num+1;
end
end
end
nn=n;
V = zernpoly(n,m,r(idx),theta(idx),1); %计算各个象素的多项式
% r(idx)与theta(idx)分别按照列扫描的方式,将a在单位圆内的部分转变成1行
% -------- 根据zernike多项式计算Zernike矩 --------%
f=(a(idx))';
Zernike=f*V;
[u v]=size(Zernike);
for k=1:v
Zernike(k)=((nn(k)+1)/pi)*Zernike(k);
Zernike_mag(k)=abs(Zernike(k));
end
ord = n;
repet = m;
%----------------------------- 计算结束 ----------------------------------%