/** Returns a string containing information about this FHT. */ public String toString() { return "FHT, " + getWidth() + "x"+getHeight() + ", fd=" + isFrequencyDomain; }
/** Returns a string containing information about this FHT. */ public String toString() { return "FHT, " + getWidth() + "x"+getHeight() + ", fd=" + isFrequencyDomain; }
static Point2D.Double findMaximaWithSubpixelPrecision(Point2D.Double maximumCoords, int roiSize, FHT crossCorrelationImage) { double[] subImageData = new double[roiSize * roiSize]; float[] pixels = (float[]) crossCorrelationImage.getPixels(); int roiX = (int) maximumCoords.x - (roiSize - 1) / 2; int roiY = (int) maximumCoords.y - (roiSize - 1) / 2; if(isCloseToBorder((int) maximumCoords.x, (int) maximumCoords.y, (roiSize - 1) / 2, crossCorrelationImage)) { return maximumCoords; } for(int ys = roiY; ys < roiY + roiSize; ys++) { int offset1 = (ys - roiY) * roiSize; int offset2 = ys * crossCorrelationImage.getWidth() + roiX; for(int xs = 0; xs < roiSize; xs++) { subImageData[offset1++] = pixels[offset2++]; } } SubImage subImage = new SubImage(roiSize, roiSize, null, null, subImageData, 0, 0); RadialSymmetryFitter radialSymmetryFitter = new RadialSymmetryFitter(); Molecule psf = radialSymmetryFitter.fit(subImage); return new Point2D.Double((int) maximumCoords.x + psf.getX(), (int) maximumCoords.y + psf.getY()); }
public FHT(ImageProcessor ip, boolean isFrequencyDomain) { super(ip.getWidth(), ip.getHeight(), (float[])((ip instanceof FloatProcessor)?ip.duplicate().getPixels():ip.convertToFloat().getPixels()), null); this.isFrequencyDomain = isFrequencyDomain; maxN = getWidth(); resetRoi(); }
public FHT(ImageProcessor ip, boolean isFrequencyDomain) { super(ip.getWidth(), ip.getHeight(), (float[])((ip instanceof FloatProcessor)?ip.duplicate().getPixels():ip.convertToFloat().getPixels()), null); this.isFrequencyDomain = isFrequencyDomain; maxN = getWidth(); resetRoi(); }
void customFilter(FHT fht) { int size = fht.getWidth(); showStatus("Filtering"); fht.swapQuadrants(filter); float[] fhtPixels = (float[])fht.getPixels(); boolean isFloat = filter.getBitDepth()==32; for (int i=0; i<fhtPixels.length; i++) { if (isFloat) fhtPixels[i] = fhtPixels[i]*filter.getf(i); else fhtPixels[i] = (float)(fhtPixels[i]*(filter.get(i)/255.0)); } fht.swapQuadrants(filter); }
void customFilter(FHT fht) { int size = fht.getWidth(); showStatus("Filtering"); fht.swapQuadrants(filter); float[] fhtPixels = (float[])fht.getPixels(); boolean isFloat = filter.getBitDepth()==32; for (int i=0; i<fhtPixels.length; i++) { if (isFloat) fhtPixels[i] = fhtPixels[i]*filter.getf(i); else fhtPixels[i] = (float)(fhtPixels[i]*(filter.get(i)/255.0)); } fht.swapQuadrants(filter); }
/** * Multiplies a Fourier domain image by a filter * @param imp A frequency domain image, which is modified. * @param filter The filter, 32-bits (0-1) or 8-bits (0-255) * @see #forward * @see #inverse * @see #filter */ public static void multiply(ImagePlus imp, ImageProcessor filter) { Object obj = imp.getProperty("FHT"); FHT fht = obj!=null&&(obj instanceof FHT)?(FHT)obj:null; if (fht==null) return; int size = fht.getWidth(); boolean isFloat = filter.getBitDepth()==32; if (!isFloat) filter = filter.convertToByte(true); filter = filter.resize(size, size); fht.swapQuadrants(filter); float[] fhtPixels = (float[])fht.getPixels(); for (int i=0; i<fhtPixels.length; i++) { if (isFloat) fhtPixels[i] = fhtPixels[i]*filter.getf(i); else fhtPixels[i] = (float)(fhtPixels[i]*(filter.get(i)/255.0)); } fht.swapQuadrants(filter); imp.setProcessor(null, fht.getPowerSpectrum()); }
public void run(ImageProcessor ip) { slice++; if (done) return; FHT fht = newFHT(ip); if (slice==1) { filter = getFilter(fht.getWidth()); if (filter==null) { done = true; return; } } ((FHT)fht).transform(); customFilter(fht); doInverseTransform(fht, ip); if (slice==1) ip.resetMinAndMax(); if (slice==stackSize) { new ContrastEnhancer().stretchHistogram(imp, 0.0); imp.updateAndDraw(); } IJ.showProgress(1.0); if (Recorder.record && slice==1) Recorder.recordCall("FFT.filter(imp,filter); //see Help/Examples/JavaScript/FFT Filter"); }
public void run(ImageProcessor ip) { slice++; if (done) return; FHT fht = newFHT(ip); if (slice==1) { filter = getFilter(fht.getWidth()); if (filter==null) { done = true; return; } } ((FHT)fht).transform(); customFilter(fht); doInverseTransform(fht, ip); if (slice==1) ip.resetMinAndMax(); if (slice==stackSize) { new ContrastEnhancer().stretchHistogram(imp, 0.0); imp.updateAndDraw(); } IJ.showProgress(1.0); if (Recorder.record && slice==1) Recorder.recordCall("FFT.filter(imp,filter); //see Help/Examples/JavaScript/FFT Filter"); }
/** * Multiplies a Fourier domain image by a filter * @param imp A frequency domain image, which is modified. * @param filter The filter, 32-bits (0-1) or 8-bits (0-255) * @see #forward * @see #inverse * @see #filter */ public static void multiply(ImagePlus imp, ImageProcessor filter) { Object obj = imp.getProperty("FHT"); FHT fht = obj!=null&&(obj instanceof FHT)?(FHT)obj:null; if (fht==null) return; int size = fht.getWidth(); boolean isFloat = filter.getBitDepth()==32; if (!isFloat) filter = filter.convertToByte(true); filter = filter.resize(size, size); fht.swapQuadrants(filter); float[] fhtPixels = (float[])fht.getPixels(); for (int i=0; i<fhtPixels.length; i++) { if (isFloat) fhtPixels[i] = fhtPixels[i]*filter.getf(i); else fhtPixels[i] = (float)(fhtPixels[i]*(filter.get(i)/255.0)); } fht.swapQuadrants(filter); imp.setProcessor(null, fht.getPowerSpectrum()); }
ImageProcessor mask = imp.getProcessor(); mask = mask.convertToByte(false); if (mask.getWidth()!=ip.getWidth() || mask.getHeight()!=ip.getHeight()) return; ImageStatistics stats = ImageStatistics.getStatistics(mask, MIN_MAX, null);
ImageProcessor mask = imp.getProcessor(); mask = mask.convertToByte(false); if (mask.getWidth()!=ip.getWidth() || mask.getHeight()!=ip.getHeight()) return; ImageStatistics stats = ImageStatistics.getStatistics(mask, MIN_MAX, null);
crossCorrelationImage.getWidth() / 2 + magnification * (lowResMaximumCoords.x - (lowResCrossCorrelationImage.getWidth() / 2)), crossCorrelationImage.getHeight() / 2 + magnification * (lowResMaximumCoords.y - (lowResCrossCorrelationImage.getHeight() / 2))); driftXofImage[i] = (crossCorrelationImage.getWidth() / 2 - highResMaximumCoords.x); driftYofImage[i] = (crossCorrelationImage.getHeight() / 2 - highResMaximumCoords.y);