package edu.harvard.mcb.leschziner.analyze; import java.util.Collection; import java.util.Iterator; import edu.harvard.mcb.leschziner.core.Particle; public class ClassAverager { /** * Averages a set of particles to generate an average, summing each pixel * location across all particles, then dividing by the number of images. * Average does segregate colorchannels. Returns null if the particle set is * empty * * @param particles * : to be averaged * @return A single average particle */ public static Particle average(Collection<Particle> particles) { Iterator<Particle> iter = particles.iterator(); int particleCount = particles.size(); if (iter.hasNext()) { Particle particle = iter.next(); // Get the particle dimensions int size = particle.getSize(); // Allocate a sum buffer long[] sums = new long[size * size]; for (; iter.hasNext(); particle = iter.next()) { // Get the pixels (RGB) from the image int i = 0; for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { sums[i] += particle.getPixel(x, y); i++; } } } Particle average = particle.createCompatible(); int i = 0; for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { average.setPixel(x, y, (int) (sums[i] / particleCount)); i++; } } return average; } else { return null; } } }