Re: setMinAndMax() fails on currently selected channel of a CompositeImage
Posted by
Rasband, Wayne (NIH/NIMH) [E] on
May 21, 2010; 5:59pm
URL: http://imagej.273.s1.nabble.com/setMinAndMax-fails-on-currently-selected-channel-of-a-CompositeImage-tp3688229p3688230.html
On May 21, 2010, at 1:07 PM, Michael Ellis wrote:
> I'm trying to write a plugin that will let me interactively manipulate
> a CompositeImage.
> I find setMinAndMax() fails to work on the image processor returned by
> getProcessor(channelIndex)
> for the currently selected channel of the CompositeImage.
>
> The plugin below is a minimal piece of code that illustrates my problem.
> It creates an 8 bit 256x256 3 channel CompositeImage filling each
> channel with a ramp.
> By default the LUTS for each channel are:
> channel 1 = red
> channel 2 = green
> channel 3 = blue
>
> I set the min and max values using setMinAndMax(175,200) for each
> channel.
> I repeat this three times, selecting channel 1, then 2, then 3. In
> each case the
> setMinAndMax(175,200) appears to fail for the currently selected
> channel.
>
> My goal is to create a plugin where I can interactively adjust the
> enabled,
> min and max values for every plane in a composite image.
>
> Using setPosition() to select a channel other than the one I want to
> adjust
> seems to work around the problem (try setting workAround to true) but
> this
> seem inelegant and probably indicative that I am doing something wrong!
>
> Help!
Try using
imp.setPosition(channel, imp.getSlice(), imp.getFrame());
imp.setDisplayRange(min, max);
which is what the "Image>Adjust>Color Balance widget (ij.plugin.frame.ContrastAdjuster.java) uses.
-wayne
>
> /
> *------------------------------------------------------------------------------------------------------------*/
> import ij.CompositeImage;
> import ij.IJ;
> import ij.ImagePlus;
> import ij.plugin.PlugIn;
> import ij.process.ImageProcessor;
>
> public class My_Plugin implements PlugIn {
>
> public My_Plugin() {
> }
>
> public void run(String arg) {
> for (int channelSelect = 1; channelSelect <= 3; ++channelSelect) {
> ImagePlus imp = IJ.createImage("Chan select=" + channelSelect, "8-
> bit Ramp", 256, 256, 3);
> CompositeImage ci = new CompositeImage(imp,
> CompositeImage.COMPOSITE);
> ci.show();
>
> ci.setPosition(channelSelect);
>
> for (int channelIndex = 1; channelIndex <= 3; ++channelIndex) {
> boolean workAround = false;
> if (workAround) {
> // Select any channel other than the one we are changing.
> ci.setPosition(channelIndex < 3 ? channelIndex + 1 : 1);
> }
> final int min = 175, max = 200;
> ImageProcessor cip = ci.getProcessor(channelIndex);
> cip.setMinAndMax(min, max);
> ci.updateAndDraw();
> }
> }
> }
> }