package edu.harvard.mcb.leschziner.particlefilter; import java.util.Vector; import edu.harvard.mcb.leschziner.core.Particle; import edu.harvard.mcb.leschziner.core.ParticleFilter; /** * A Filter that finds the center of mass of a particle, and moves that center * to the center of the particle's box * * @author spartango * */ public class MassCenterer implements ParticleFilter { /** * */ private static final long serialVersionUID = 3903067451461061220L; // List of filters to be applied prior to center-finding private final Vector<ParticleFilter> preFilters; /** * Builds a new centerer, ready to center particles */ public MassCenterer() { preFilters = new Vector<ParticleFilter>(); } /** * Finds a particle's center of mass, and then generates a new particle by * shifting the original to center that point */ @Override public Particle filter(Particle target) { // Find center of mass // in X // Sum mass of each column, find greatest int massCenterX = 0; int massCenterY = 0; // Low Pass filter the target to make centering easier Particle filtered = target; for (ParticleFilter filter : preFilters) { filtered = filter.filter(filtered); } int maxMassX = 0; for (int x = 0; x < target.getSize(); x++) { int mass = 0; // Sum mass for (int y = 0; y < target.getSize(); y++) { mass += target.getPixel(x, y); } if (mass > maxMassX) { maxMassX = mass; massCenterX = x; } } // in Y // Sum mass of each row, find greatest int maxMassY = 0; for (int y = 0; y < target.getSize(); y++) { int mass = 0; // Sum mass for (int x = 0; x < target.getSize(); x++) { mass += target.getPixel(x, y); } if (mass > maxMassY) { maxMassY = mass; massCenterY = y; } } System.out.println("[MassCenterer]: Center at (" + massCenterX + ", " + massCenterY + ")"); Shifter shift = new Shifter((target.getSize() / 2) - massCenterX, (target.getSize() / 2) - massCenterY); return shift.filter(target); } /** * Add filter to be applied to particles that will be centered, so as to * reduce noise/error in center of mass finding * * @param particle * filter */ public void addPreFilter(ParticleFilter p) { preFilters.add(p); } }