MATLAB Answers

Sachin
0

how to write matlab code for moments?

Asked by Sachin
on 11 Apr 2013
Latest activity Answered by Sparsh Garg on 15 Jun 2018

i have this code for calculating moments function [M]= moments(I) [r c]=size(I); m=zeros(r,c); % geometric moments for i=0:1 for j=0:1 for x=1:r for y=1:c m(i+1,j+1)=m(i+1,j+1)+(x^i*y^j*I(x,y)); end end end end

xb=m(2,1)/m(1,1); yb=m(1,2)/m(1,1);

% central moments u=[ 0 0 0 0;0 0 0 0;0 0 0 0;0 0 0 0]; for i=0:3 for j=0:3 for x=1:r for y=1:c u(i+1,j+1)=u(i+1,j+1)+(x-xb)^i*(y-yb)^j*I(x,y); end end end end

% scale invariant moments n=[ 0 0 0 0;0 0 0 0;0 0 0 0;0 0 0 0]; for i=0:3 for j=0:3 n(i+1,j+1)=u(i+1,j+1)/(u(1,1)^(1+(i+j)/2)); end end

%rotation invariant moments I_1= n(3,1)+ n(1,3); I_2=(n(3,1)- n(1,3) )^2+ (2*n(2,2))^2; I_3=(n(4,1)-3*n(2,3))^2+ (3*n(3,2)-n(1,4))^2; I_4=(n(4,1)+n(2,3))^2+ (n(3,2)+n(1,4))^2; I_5=(n(4,1)-3*n(2,3))*(n(4,1)+n(2,3))*((n(4,1)+n(2,3))^2-3*(n(3,2)+n(1,4))^2)+(3*n(3,2)-n(1,4))*(n(3,2)+n(1,4))*(3*(n(4,1)+n(2,3))^2-(n(3,2)+n(1,4))^2); I_6=(n(3,1)-n(1,3))*((n(4,1)+n(2,3))^2-(n(3,2)+n(1,4))^2)+ 4*n(2,2)*(n(4,1)+n(2,3))*(n(3,2)+n(1,4)); I_7=(3*n(3,2)-n(1,4))*(n(4,1)+n(2,3))*((n(4,1)+n(2,3))^2- 3*(n(3,2)+n(1,4))^2 )- (n(1,4)-3*n(2,3))*(n(3,2)+n(1,4))*(3*(n(4,1)+n(2,3))^2-(n(3,2)+n(1,4))^2);

M= [I_1 I_2 I_3 I_4 I_5 I_6 I_7];

but it gives same values for all images is this correct way to calculate moments?

  0 Comments

Sign in to comment.

3 Answers

Answer by Iman Ansari on 12 Apr 2013
Edited by Iman Ansari on 12 Apr 2013
 Accepted Answer

You may need to convert your input image to double. In uint8 numbers greater than 255 became 255.

function [M]= moments(I)
I=double(I);
[r c]=size(I); 
m=zeros(r,c); 
% geometric moments 
for i=0:1 
    for j=0:1 
        for x=1:r 
            for y=1:c 
                m(i+1,j+1)=m(i+1,j+1)+(x^i*y^j*I(x,y)); 
            end
        end
    end
end
xb=m(2,1)/m(1,1); 
yb=m(1,2)/m(1,1);
% central moments 
u=[ 0 0 0 0;0 0 0 0;0 0 0 0;0 0 0 0]; 
for i=0:3 
    for j=0:3 
        for x=1:r 
            for y=1:c 
                u(i+1,j+1)=u(i+1,j+1)+(x-xb)^i*(y-yb)^j*I(x,y); 
            end
        end
    end
end
% scale invariant moments 
n=[ 0 0 0 0;0 0 0 0;0 0 0 0;0 0 0 0]; 
for i=0:3 
    for j=0:3 
        n(i+1,j+1)=u(i+1,j+1)/(u(1,1)^(1+(i+j)/2)); 
    end
end
%rotation invariant moments 
I_1= n(3,1)+ n(1,3); 
I_2=(n(3,1)- n(1,3) )^2+ (2*n(2,2))^2; 
I_3=(n(4,1)-3*n(2,3))^2+ (3*n(3,2)-n(1,4))^2; 
I_4=(n(4,1)+n(2,3))^2+ (n(3,2)+n(1,4))^2; 
I_5=(n(4,1)-3*n(2,3))*(n(4,1)+n(2,3))*((n(4,1)+n(2,3))^2-3*(n(3,2)+n(1,4))^2)...
    +(3*n(3,2)-n(1,4))*(n(3,2)+n(1,4))*(3*(n(4,1)+n(2,3))^2-(n(3,2)+n(1,4))^2); 
I_6=(n(3,1)-n(1,3))*((n(4,1)+n(2,3))^2-(n(3,2)+n(1,4))^2)+ 4*n(2,2)*(n(4,1)...
    +n(2,3))*(n(3,2)+n(1,4)); 
I_7=(3*n(3,2)-n(1,4))*(n(4,1)+n(2,3))*((n(4,1)+n(2,3))^2- 3*(n(3,2)+n(1,4))^2 )...
    - (n(1,4)-3*n(2,3))*(n(3,2)+n(1,4))*(3*(n(4,1)+n(2,3))^2-(n(3,2)+n(1,4))^2);
M= [I_1 I_2 I_3 I_4 I_5 I_6 I_7];

  3 Comments

thnx a lot iman

Iman how to call the function? I'm trying it, no error but when I run it, There is no image in the figure

Sign in to comment.


Answer by Akshit Vekariya on 6 May 2015
Edited by Akshit Vekariya on 6 May 2015

will this code work on moment invariant...?

  0 Comments

Sign in to comment.


Answer by Sparsh Garg on 15 Jun 2018

I am getting error Function definitions are not permitted in this context. please explain how to solve this error

  0 Comments

Sign in to comment.