Matlab:如何计算伪Zernike矩?

Matlab:如何计算伪Zernike矩?,matlab,Matlab,以下代码定义为计算伪Zernike径向多项式的算法1: function R = pseudo_zernike_radial_polynomials(n,r) if any( r>1 | r<0 | n<0) error(':zernike_radial_polynomials either r is less than or greater thatn 1, r must be between 0 and 1 or n is less than 0.') end

以下代码定义为计算伪Zernike径向多项式的算法1:

function R = pseudo_zernike_radial_polynomials(n,r)

if any( r>1 | r<0 | n<0)
    error(':zernike_radial_polynomials either r is less than or greater thatn 1,   r must be between 0 and 1 or n is less than 0.')
end


if n==0;
    R =ones(n +1, length(r));
    return;
end

R =ones(n +1, length(r));


rSQRT= sqrt(r);
r0 = ~logical(rSQRT.^(2*n+1)) ;  % if any low r exist, and high n, then treat as 0 

if any(r0)
    m = n:-1:mod(n,2); ss=1:sum(r0);
    R0(m +1, ss)=0;
    R0(0 +1, ss)=1;
    R(:,r0)=R0;
end

if any(~r0)    
   rSQRT= rSQRT(~r0);
    R1 = zernike_radial_polynomials(2*n+1, rSQRT );    
    m = 2:2: 2*n+1 +1;
    R1=R1(m,:);    
    for m=1:size(R1,1)
        R1(m,:) = R1(m,:)./rSQRT';
    end
    R(:,~r0)=R1;
end

计算的细节可以看到

我的猜测:
rad,psi
不同大小的向量。请执行:
size(rad)、size(psi)、size(Pzm)
在第44行之前插入以查看大小。我猜:
rad、psi
不同大小的向量。请执行:
尺寸(rad)、尺寸(psi)、尺寸(Pzm)
在第44行之前调整以查看尺寸。
clear all
%input : 2D image f, Nmax = order.
f = rgb2gray(imread('Oval_45.png'));
prompt = ('Input PZM order Nmax:');
Nmax = input(prompt);

Pzm =0;
l = size(f,1);

for x = 1:l;
    for y =x;
        for n = 0:Nmax;

            [X,Y] = meshgrid(x,y);
            R = sqrt((2.*X-l-1).^2+(2.*Y-l-1).^2)/l;
            theta = atan2((l-1-2.*Y+2),(2.*X-l+1-2));
            R = (R<=1).*R;
            rad = pseudo_zernike_radial_polynomials(n, R);
            for m = 0:n;
                %find psi
                if mod(m,2)==0
                    %m is even
                    newd1 = f(x,y)+f(x,y);
                    newd2 = f(y,x)+f(y,x);
                    newd3 = f(x,y)+f(x,y);
                    newd4 = f(y,x)+f(y,x);

                    x1 = newd1;
                    y1 = (-1)^m/2*newd2;
                    x2 = newd3;
                    y2 = (-1)^m/2*newd4;
                    psi = cos(m*theta)*(x1+y1+x2+y2)-(1i)*sin(m*theta)*(x1+y1-x2-y2);
                else
                    newd1 = f(x,y)-f(x,y);
                    newd2 = f(y,x)-f(y,x);
                    newd3 = f(x,y)-f(x,y);
                    newd4 = f(y,x)-f(y,x);
                    x1 = newd1;
                    y1 = (-1)^m/2*newd2;
                    x2 = newd3;
                    y2 = (-1)^m/2*newd4;
                    psi = cos(m*theta)*(x1+x2)+sin(m*theta)*(y1-y2)+(1i)*(cos(m*theta)*(y1+y2)-sin(m*theta)*(x1-x2));
                end
                Pzm = Pzm+rad*psi;
            end
        end
    end
end
Error using  * 
Integers can only be combined with integers of the same class, or scalar doubles.

Error in main_pzm (line 44)
                Pzm = Pzm+rad*psi;