Asked by Sachin
on 11 Apr 2013

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?

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];

Sachin
on 12 Apr 2013

thnx a lot iman

fateme
on 28 May 2014

thanks

Ricki Chindra
on 9 Nov 2014

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...?

Sign in to comment.

Answer by Sparsh Garg
on 15 Jun 2018

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.