diff --git a/src/main/java/fr/pasteur/ida/zellige/steps/ChannelImageSelection.java b/src/main/java/fr/pasteur/ida/zellige/steps/ChannelImageSelection.java index 604ea6db8035629dc2bc29fcf2771f8b31f6a75f..6d3d53dbdbf0ccadd5e18749b0b9862cf6a309c0 100644 --- a/src/main/java/fr/pasteur/ida/zellige/steps/ChannelImageSelection.java +++ b/src/main/java/fr/pasteur/ida/zellige/steps/ChannelImageSelection.java @@ -2,23 +2,39 @@ package fr.pasteur.ida.zellige.steps; import net.imagej.Dataset; import net.imagej.ImgPlus; +import net.imagej.display.DefaultDatasetView; import net.imglib2.RandomAccess; +import net.imglib2.display.ColorTable; import net.imglib2.img.Img; import net.imglib2.type.NativeType; import net.imglib2.type.numeric.RealType; +import java.util.ArrayList; + + public class ChannelImageSelection< T extends RealType< T > & NativeType< T > > { - + private final static int GRAYS = 0; + private final static int RED = 1; + private final static int BLUE = 2; + private final static int GREEN = 3; + private final static int CYAN = 4; + private final static int MAGENTA = 5; + private final static int YELLOW = 6; private final int targetChannel; private final Dataset dataset; - public static< T extends RealType< T > & NativeType< T > > Img< T > run(Dataset input, int targetChannel) + public static < T extends RealType< T > & NativeType< T > > Img< T > run( Dataset input, int targetChannel ) { - ChannelImageSelection<T> channelImageSelection = new ChannelImageSelection<>( input, targetChannel ); + ChannelImageSelection< T > channelImageSelection = new ChannelImageSelection<>( input, targetChannel ); return channelImageSelection.run(); } + /** + * + * @param dataset + * @param targetChannel + */ public ChannelImageSelection( Dataset dataset, int targetChannel ) { this.targetChannel = targetChannel; @@ -28,9 +44,9 @@ public class ChannelImageSelection< T extends RealType< T > & NativeType< T > > public Img< T > run() { Img< T > input = ( ImgPlus< T > ) this.dataset.getImgPlus(); - if (getTargetChannel() == 0) + if ( getTargetChannel() == 0 ) { - return input; + return input; } else { @@ -43,7 +59,7 @@ public class ChannelImageSelection< T extends RealType< T > & NativeType< T > > { for ( int z = 0; z < ( int ) input.dimension( 3 ); z++ ) { - randomAccess.setPositionAndGet( x, y, getTargetChannel()-1, z ); + randomAccess.setPositionAndGet( x, y, getTargetChannel() - 1, z ); randomAccess1.setPosition( new int[]{ x, y, z } ); randomAccess1.get().set( randomAccess.get() ); } @@ -52,8 +68,76 @@ public class ChannelImageSelection< T extends RealType< T > & NativeType< T > > return output; } } + public int getTargetChannel() { return targetChannel; } + + + /** + * + * @param defaultDatasetView the input image + * @return an int array of colors + */ + private static int[] getColors( DefaultDatasetView defaultDatasetView ) + { + return getColors( ( DefaultDatasetView ) defaultDatasetView.getColorTables() ); + } + + private static int [] getColors( ArrayList<ColorTable> colorTables) + { + int[] colors = new int[ colorTables.size() ]; + if (colors.length == 1) + { + colors[0] = GRAYS; + return colors; + } + for ( int i = 0; i <colorTables.size(); i++ ) + { + colors[i]= getColor( colorTables.get( i )); + } + return colors; + } + + private static int getColor( ColorTable colorTable ) + { + int R = colorTable.get( 0, 255 ); + int G = colorTable.get( 1, 255 ); + int B = colorTable.get( 2, 255 ); + if ( R== 0) + { + if (G == 0) + { + return BLUE; // BLUE + } + else + { + if (B == 0) + { + return GREEN; // GREEN + } + return CYAN ; // CYAN + } + } + else + { + if (G == 0) + { + if (B == 0) + { + return RED; // RED + } + return MAGENTA ; // MAGENTA + } + else + { + if (B == 0) + { + return YELLOW; // YELLOW + } + return GRAYS ; // GRAYS + } + } + } }