View Javadoc

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