//----------------------------------------------------------------------------// // // // B a s i c A R T M o m e n t s // // // //----------------------------------------------------------------------------// // <editor-fold defaultstate="collapsed" desc="hdr"> // // Copyright © Hervé Bitteur and others 2000-2013. All rights reserved. // // This software is released under the GNU General Public License. // // Goto http://kenai.com/projects/audiveris to report bugs or suggestions. // //----------------------------------------------------------------------------// // </editor-fold> package omr.moments; /** * Class {@code BasicARTMoments} implements a basic region-based * shape descriptor. * * See MPEG-7 Experimentation Model for the original C++ code * * @author Hervé Bitteur */ public class BasicARTMoments implements ARTMoments { //~ Instance fields -------------------------------------------------------- /** Module values */ private final double[][] modules = new double[ANGULAR][RADIAL]; /** Argument values */ private final double[][] arguments = new double[ANGULAR][RADIAL]; /** Imaginary values */ private final double[][] imags = new double[ANGULAR][RADIAL]; /** Real values */ private final double[][] reals = new double[ANGULAR][RADIAL]; //~ Constructors ----------------------------------------------------------- //------------------// // BasicARTMoments // //------------------// /** * Creates a new BasicARTMoments object. */ public BasicARTMoments () { } //~ Methods ---------------------------------------------------------------- //-----------// // getModule // //-----------// @Override public final double getModule (int p, int r) { return modules[p][r]; } //-----------// // setModule // //-----------// @Override public final void setModule (int p, int r, double value) { modules[p][r] = value; } //------------// // distanceTo // //------------// /** * Implements a Manhattan distance * * @param that the other ARTMoments descriptor * @return the (Manhattan) distance */ @Override public double distanceTo (ARTMoments that) { double distance = 0; for (int p = 0; p < ANGULAR; p++) { for (int r = 0; r < RADIAL; r++) { if ((p != 0) || (r != 0)) { distance += Math.abs( that.getModule(p, r) - getModule(p, r)); // distance += Math.abs(that.getReal(p, r) - getReal(p, r)); // distance += Math.abs(that.getImag(p, r) - getImag(p, r)); } } } return distance; } //-------------// // getArgument // //-------------// @Override public double getArgument (int p, int r) { return arguments[p][r]; } @Override public double getImag (int p, int r) { return imags[p][r]; } //-----------// // getMoment // //-----------// @Override public double getMoment (int m, int n) { return getModule(m, n); } @Override public double getReal (int p, int r) { return reals[p][r]; } //-------------// // setArgument // //-------------// @Override public void setArgument (int p, int r, double value) { arguments[p][r] = value; } @Override public void setImag (int p, int r, double value) { imags[p][r] = value; } //-----------// // setMoment // //-----------// @Override public void setMoment (int m, int n, double value) { setModule(m, n, value); } @Override public void setReal (int p, int r, double value) { reals[p][r] = value; } //----------// // toString // //----------// @Override public String toString () { StringBuilder sb = new StringBuilder("{"); for (int p = 0; p < ANGULAR; p++) { for (int r = 0; r < RADIAL; r++) { if ((p != 0) || (r != 0)) { if (sb.length() > 1) { sb.append(" "); } sb.append(String.format("%3.0f", 1000 * getMoment(p, r))); } } } sb.append("}"); return sb.toString(); } }