1 /**
2 * Copyright (c) 2011, The University of Southampton and the individual contributors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * * Neither the name of the University of Southampton nor the names of its
16 * contributors may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package org.openimaj.image.connectedcomponent.proc;
31
32 import org.openimaj.feature.DoubleFV;
33 import org.openimaj.feature.FeatureVectorProvider;
34 import org.openimaj.image.pixel.ConnectedComponent;
35 import org.openimaj.image.processor.connectedcomponent.ConnectedComponentProcessor;
36
37
38 /**
39 * Implementation of the 7 Hu moments for describing
40 * connected component shape.
41 *
42 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
43 */
44 public class HuMoments implements ConnectedComponentProcessor, FeatureVectorProvider<DoubleFV> {
45 /**
46 * The first Hu moment
47 */
48 public double h1;
49
50 /**
51 * The second Hu moment
52 */
53 public double h2;
54
55 /**
56 * The third Hu moment
57 */
58 public double h3;
59
60 /**
61 * The forth Hu moment
62 */
63 public double h4;
64
65 /**
66 * The fifth Hu moment
67 */
68 public double h5;
69
70 /**
71 * The sixth Hu moment
72 */
73 public double h6;
74
75 /**
76 * The seventh Hu moment
77 */
78 public double h7;
79
80 @Override
81 public void process(ConnectedComponent cc) {
82 double v11 = cc.calculateMomentNormalised(1, 1);
83
84 double v12 = cc.calculateMomentNormalised(1, 2);
85 double v21 = cc.calculateMomentNormalised(2, 1);
86
87 double v02 = cc.calculateMomentNormalised(0, 2);
88 double v20 = cc.calculateMomentNormalised(2, 0);
89
90 double v03 = cc.calculateMomentNormalised(0, 3);
91 double v30 = cc.calculateMomentNormalised(3, 0);
92
93 h1 = v20 + v02;
94 h2 = ((v20 - v02) * (v20 - v02)) + (4 * v11 * v11);
95 h3 = ((v30 - 3*v12)*(v30 - 3*v12)) + ((3*v21 - v03)*(3*v21 - v03));
96 h4 = ((v30+v12)*(v30+v12)) + ((v21+v03)*(v21+v03));
97 h5 = (((v30 - 3*v12)*(v30+v12)) * (((v30+v12)*(v30+v12) - (3*(v21+v03)*(v21+v03))))) +
98 (((3*v21-v03)*(v21+v03)) * ((3*(v30+v12)*(v30+v12)) - (v21+v03)*(v21+v03)));
99 h6 = ((v20 - v02) * ((v30+v12)*(v30+v12) - (v21 + v03)*(v21 + v03))) + (4*v11*(v30+v12)*(v21+v03));
100 h7 = ((3*v21 - v03)*(v30+v12)*((v30+v12)*(v30+v12) - 3*(v21+v03)*(v21+v03))) -
101 ((v30-3*v12)*(v21+v03)*(3*(v30+v12)*(v30+v12) - (v21+v03)*(v21+v03)));
102 }
103
104 @Override
105 public String toString() {
106 return String.format("%2.2f, %2.2f, %2.2f, %2.2f, %2.2f, %2.2f, %2.2f", h1, h2, h3, h4, h5, h6, h7);
107 }
108
109 /**
110 * Get all the values of the descriptor as an array.
111 * @return an array of descriptor values
112 */
113 public double[] getFeatureVectorArray() {
114 return new double[] {h1, h2, h3, h4, h5, h6, h7};
115 }
116
117 @Override
118 public DoubleFV getFeatureVector() {
119 return new DoubleFV(getFeatureVectorArray());
120 }
121 }
122