package fr.unistra.pelican.algorithms.conversion; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.BooleanImage; import fr.unistra.pelican.Image; import fr.unistra.pelican.util.mask.BooleanMask; /** * Given a colour image, it extracts a given colour with integer precision, * resulting into a binary monochannel image. * * MASK MANAGEMENT (by Régis) : * - pixels absent in input are considered of a different color than (c1,c2,c3). * - output image mask is 1 band large and is the input image bands AND. * * @author Erchan Aptoula * */ public class ColourExtractor extends Algorithm { /** * First Input parameter. */ public Image input; /** * Second Input parameter. */ public int c1; /** * Third Input parameter. */ public int c2; /** * Fourth Input parameter. */ public int c3; /** * Output parameter. */ public Image output; /** * Constructor * */ public ColourExtractor() { super(); super.inputs = "input,c1,c2,c3"; super.outputs = "output"; } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() throws AlgorithmException { int xdim = input.getXDim(); int ydim = input.getYDim(); int zdim = input.getZDim(); int tdim = input.getTDim(); int bdim = input.getBDim(); if (bdim != 3) throw new AlgorithmException( "The input must be a tristumulus RGB image"); output = new BooleanImage(xdim, ydim, zdim, tdim, 1); output.setColor(true); boolean flag; for (int x = 0; x < xdim; x++) { for (int y = 0; y < ydim; y++) { for (int z = 0; z < zdim; z++) { for (int t = 0; t < tdim; t++) { int p1 = input.getPixelXYZTBByte(x, y, z, t, 0); int p2 = input.getPixelXYZTBByte(x, y, z, t, 1); int p3 = input.getPixelXYZTBByte(x, y, z, t, 2); if ( p1 == c1 && p2 == c2 && p3 == c3 ) flag = true; else flag = false; flag = flag && input.isPresentXYZTB( x,y,z,t, 0 ) && input.isPresentXYZTB( x,y,z,t, 1 ) && input.isPresentXYZTB( x,y,z,t, 2 ); output.setPixelXYZTBoolean(x, y, z, t, flag); } } } } BooleanImage mask = new BooleanImage( xdim, ydim, zdim, tdim, 1 ); for ( int x = 0 ; x < xdim ; x++ ) for ( int y = 0 ; y < ydim ; y++ ) for ( int z = 0 ; z < zdim ; z++ ) for ( int t = 0 ; t < tdim ; t++ ) mask.setPixelXYZTBoolean( x,y,z,t, input.isPresentXYZTB( x,y,z,t, 0 ) && input.isPresentXYZTB( x,y,z,t, 1 ) && input.isPresentXYZTB( x,y,z,t, 2 ) ); output.pushMask( new BooleanMask( mask ) ); } /** * Given a colour image, it extracts a given colour with integer precision, * resulting into a binary monochannel image. * * @param input * Colour image * @param c1 * Color 1 * @param c2 * Color 2 * @param c3 * Color 3 * @return The resulting RGB image */ public static Image exec(Image input, int c1, int c2, int c3) { return (Image) new ColourExtractor().process(input, c1, c2, c3); } // public static void main(String[] args) { // Image img = (Image) new ImageLoader() // .process("samples/Corel1000/building/200.jpg"); // new Viewer2D().process(img, "giris"); // img = (Image) new ColourExtractor().process(img, 73, 106, 125); // new Viewer2D().process(img, "sonuc"); // // } }