package fr.unistra.pelican.algorithms.frequential; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.DoubleImage; import fr.unistra.pelican.Image; import fr.unistra.pelican.PelicanException; import fr.unistra.pelican.algorithms.io.ImageLoader; import fr.unistra.pelican.algorithms.visualisation.MViewer; /** * High pass circular frequencial filter. Remove main features, keep details! * A smaller radius means more major frequencies are kept... * * @author Benjamin Perret */ public class HighPass extends Algorithm { /** * Image input */ public Image input; /** * Radius of circular filter */ public double radius; /** * Filtered image */ public Image output; /** * Constructor * */ public HighPass() { super(); super.inputs = "input,radius"; super.outputs = "output"; } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() throws AlgorithmException { DoubleImage inputRe=input.newDoubleImage(true); DoubleImage inputIm=null; DoubleImage[] outputs = FFT2.exec(inputRe,inputIm,false); int i2, j2; double r2 = radius * radius; int xdim=input.xdim; int ydim=input.ydim; int cx=xdim/2; int cy=ydim/2; for (int j = 0; j < ydim; j++) { for (int i = 0; i < xdim; i++) { if (i >= cx) i2 = i - xdim; else i2 = i; if (j >= cy) j2 = j - ydim; else j2 = j; double r=i2*i2+j2*j2; if(r<=r2) { for(int b=0;b<input.bdim;b++) { outputs[0].setPixelXYBDouble(i, j,b, 0.0); outputs[1].setPixelXYBDouble(i, j,b, 0.0); } } } } outputs = FFT2.exec(outputs[0],outputs[1],true); Image res = Magnitude.exec(outputs); if(inputIm instanceof DoubleImage) { output=res; } else{ output=input.copyImage(false); for(int i=0;i<output.size();i++) output.setPixelDouble(i, res.getPixelDouble(i)); } } /** * High pass circular frequential filter. A * smaller radius means more major frequences are kept... * * * @param input Input Image * @param radius Filter radius * @return High Pass filtered image */ public static <T extends Image> T exec(T input, double radius) { return (T) new HighPass().process(input,radius); } /*public static void main(String [] args) { Image im1=ImageLoader.exec("samples/lennaGray256.png"); Image im2=ImageLoader.exec("samples/AstronomicalImagesFITS/img1-10.fits"); MViewer.exec(im1,HighPass.exec(im1,40),im2,HighPass.exec(im2,40)); }*/ }