package fr.unistra.pelican.algorithms.conversion; import fr.unistra.pelican.*; /** * Transforms a quadristumulus RGBA image into a graylevel image using the formula : * <tt>gray = 0.299 x R + 0.587 x G + 0.114 x B</tt> * <p> * MASK MANAGEMENT : * <ul> * <li> input's mask becomes output's mask. * <li> no modification on color calculation. * </ul> * * @author Régis Witz */ public class RGBAToGray extends Algorithm { /** Input RGBA image. */ public Image input; /** Output gray image. */ public Image output; public RGBAToGray() { super.inputs = "input"; super.outputs = "output"; } public void launch() throws AlgorithmException { int xdim = this.input.getXDim(); int ydim = this.input.getYDim(); int zdim = this.input.getZDim(); int tdim = this.input.getTDim(); int bdim = this.input.getBDim(); if ( bdim != 4 && bdim != 3 ) throw new AlgorithmException( "The input must be a tristumulus RGB image" ); this.output = new ByteImage( xdim,ydim,zdim,tdim, 1 ); this.output.setMask( this.input.getMask() ); this.output.setColor( false ); 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++ ) { double R = this.input.getPixelXYZTBDouble( x,y,z,t,0 ); double G = this.input.getPixelXYZTBDouble( x,y,z,t,1 ); double B = this.input.getPixelXYZTBDouble( x,y,z,t,2 ); double gray = 0.299 * R + 0.587 * G + 0.114 * B; output.setPixelXYZTDouble( x,y,z,t, gray ); } } public static Image exec( Image input ) { return ( Image ) new RGBAToGray().process( input ); } }