package gdsc.utils; import gdsc.UsageTracker; /*----------------------------------------------------------------------------- * GDSC Plugins for ImageJ * * Copyright (C) 2011 Alex Herbert * Genome Damage and Stability Centre * University of Sussex, UK * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *---------------------------------------------------------------------------*/ import ij.ImagePlus; import ij.ImageStack; import ij.plugin.filter.PlugInFilter; import ij.process.ImageProcessor; /** * Provides methods to filter the image in the z-axis for better 3-D projections. * Performs a local maxima filter in the z-axis resulting in a new image of the same * dimensions with a black background for non-maximal pixels. */ public class Projection implements PlugInFilter { private ImagePlus imp; /* * (non-Javadoc) * * @see ij.plugin.filter.PlugInFilter#setup(java.lang.String, ij.ImagePlus) */ public int setup(String arg, ImagePlus imp) { UsageTracker.recordPlugin(this.getClass(), arg); if (imp == null || imp.getNSlices() == 1) { return DONE; } this.imp = imp; return DOES_ALL; } /* * (non-Javadoc) * * @see ij.plugin.filter.PlugInFilter#run(ij.process.ImageProcessor) */ public void run(ImageProcessor inputProcessor) { ImageStack stack = imp.getStack(); ImageProcessor ip1 = null; ImageProcessor ip2 = null; ImageProcessor ip3 = stack.getProcessor(1); for (int n=2; n<=imp.getNSlices(); n++) { // Roll over processors ip1 = ip2; ip2 = ip3; ip3 = stack.getProcessor(n); process(n, ip1, ip2, ip3); } process(imp.getNSlices()+1, ip2, ip3, null); } private void process(int n, ImageProcessor ip1, ImageProcessor ip2, ImageProcessor ip3) { if (ip2 == null) return; if (ip1 != null) { // Check for maxima going backward System.out.printf("%d < %d : ", n-2, n-1); for (int i=ip2.getPixelCount(); i-->0; ) { if (ip1.get(i) > ip2.get(i)) ip2.set(i, 0); } } if (ip3 != null) { // Check for maxima going forward System.out.printf("%d > %d", n-1, n); for (int i=ip2.getPixelCount(); i-->0; ) { if (ip3.get(i) > ip2.get(i)) ip2.set(i, 0); } } System.out.printf("\n"); } }