1 | % M = MOMENTS (IM, P, Q, CENTRAL, SCALED)
|
---|
2 | %
|
---|
3 | % Calculates moments of order (P+Q) (can be arrays of indentical length)
|
---|
4 | % on image IM. If CENTRAL is set to 1 (default: 0), returns translation-
|
---|
5 | % invariant moments; if SCALED is set to 1 (default: 0), returns scale-
|
---|
6 | % invariant moments.
|
---|
7 | %
|
---|
8 | % After: M. Sonka et al., Image processing, analysis and machine vision.
|
---|
9 |
|
---|
10 | function m = moments (im,p,q,central,scaled)
|
---|
11 |
|
---|
12 | if (nargin < 5), scaled = 0; end;
|
---|
13 | if (nargin < 4), central = 0; end;
|
---|
14 | if (nargin < 3)
|
---|
15 | error ('Insufficient number of parameters.');
|
---|
16 | end;
|
---|
17 |
|
---|
18 | if (length(p) ~= length(q))
|
---|
19 | error ('Arrays P and Q should have equal length.');
|
---|
20 | end;
|
---|
21 |
|
---|
22 | if (scaled & ~central)
|
---|
23 | error ('Scale-invariant moments should always be central.');
|
---|
24 | end;
|
---|
25 |
|
---|
26 | % xx, yy are grids with co-ordinates
|
---|
27 | [xs,ys] = size(im);
|
---|
28 | [xx,yy] = meshgrid(-(ys-1)/2:1:(ys-1)/2,-(xs-1)/2:1:(xs-1)/2);
|
---|
29 |
|
---|
30 | if (central)
|
---|
31 |
|
---|
32 | % Calculate zeroth and first order moments
|
---|
33 | m00 = sum(sum(im));
|
---|
34 | m10 = sum(sum(im.*xx));
|
---|
35 | m01 = sum(sum(im.*yy));
|
---|
36 |
|
---|
37 | % This gives the center of gravity
|
---|
38 | xc = m10/m00;
|
---|
39 | yc = m01/m00;
|
---|
40 |
|
---|
41 | % Subtract this from the grids to center the object
|
---|
42 | xx = xx - xc;
|
---|
43 | yy = yy - yc;
|
---|
44 |
|
---|
45 | end;
|
---|
46 |
|
---|
47 | % Calculate moment(s) (p,q).
|
---|
48 | for i = 1:length(p)
|
---|
49 | m(i) = sum(sum((xx.^p(i)).*(yy.^q(i)).*im));
|
---|
50 | end;
|
---|
51 |
|
---|
52 | if (scaled)
|
---|
53 |
|
---|
54 | c = 1 + (p+q)/2;
|
---|
55 |
|
---|
56 | % m00 should be known, as scaled moments are always central
|
---|
57 | m = m ./ (m00.^c);
|
---|
58 |
|
---|
59 | end;
|
---|
60 |
|
---|
61 | return;
|
---|