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; 
%----------------------------- 计算结束 ----------------------------------%