[ImageJ-devel] ImageJ2 scripting
Jan Eglinger
jan.eglinger at gmail.com
Tue Apr 28 02:03:55 CDT 2015
Dear Mark and Curtis,
thank you very much for the quick replies and helpful pointers!
Jan
On 27.04.2015 20:42, Curtis Rueden wrote:
> Hi Jan,
>
> Here is another version of the script, which avoids wrapping each
> Dataset in another ImgPlus (which the framework would then wrap into yet
> another Dataset....):
>
> # @DisplayService display
> # @OpService ops
> # @net.imagej.Dataset inputData1
> # @net.imagej.Dataset inputData2
>
> inputData1.setName("my1")
> inputData2.setName("my2")
> display.createDisplay(inputData1)
> display.createDisplay(inputData2)
>
> But note that you also don't need to explicitly call createDisplay. Any
> output parameters of your script will automatically have displays
> created for them. E.g.:
>
> # @OUTPUT net.imagej.Dataset outputData
>
> Will be shown at the conclusion of the script.
>
> Apologies for the appalling lack of documentation -- it would be great
> to flesh out the wiki docs about all this.
>
> HTH,
> Curtis
>
> On Mon, Apr 27, 2015 at 1:23 PM, Mark Hiner <hiner at wisc.edu
> <mailto:hiner at wisc.edu>> wrote:
>
> Hi Jan,
>
> >an error message is displayed: "A Dataset is required but none exist."
>
> This was due to limitations with the input preprocessor presenting
> the list of datasets. Since ImagePluses aren't explicitly tracked by
> the IJ2 framework, having an ImagePlus recognized as a Dataset
> requires some extra layers. We had covered the single input case
> (which is why your first script worked) but not the general
> multi-input case. There is an issue tracking the multi-input
> <https://github.com/imagej/imagej-legacy/issues/106> case, which I
> resolved today. So this should work as intended in our next release
> - and thank you for the motivation to wrap this up!
>
> You can also manually enable ImagePlus <> Dataset synchronization to
> ensure ImagePluses always have a corresponding Dataset:
> http://imagej.net/Compatibility#Translation_of_data_structures
>
> >(where can this title be set, by the way?)
>
> For the multiple choice input selection, the labels are based on the
> name of the input type. Since the input type is Dataset, the Dataset
> name is used (which delegates to the wrapped ImgPlus). In your code
> you are applying labels to the Display, but not the underlying
> dataset - if you name the ImgPlus, or explicitly create a Dataset
> and set its name, that name will propagate up to the input chooser
> (and the Display). As a side note, you should use the
> net.imagej.ImgPlus instead of the net.imglib2.meta.
>
> An updated script would be:
>
>
> # @DisplayService display
> # @OpService ops
> # @net.imagej.Dataset inputData1
> # @net.imagej.Dataset inputData2
>
> from net.imagej import ImgPlus
>
> display.createDisplay(ImgPlus(inputData1, "my1"))
> display.createDisplay(ImgPlus(inputData2, "my2"))
>
> Hope that helps. Let me know if you have any other questions.
>
> Best,
> Mark
>
> On Mon, Apr 27, 2015 at 8:58 AM, Jan Eglinger
> <jan.eglinger at gmail.com <mailto:jan.eglinger at gmail.com>> wrote:
>
> Dear all,
>
> *** TL;DR:
> How do I proceed to get multiple input Datasets as ImageJ2
> parameters from open images in Fiji?
> ***
>
> I was recently exploring ImageJ2 scripting in Fiji and found the
> OpsThresholdIJ1Analyze template [1] in the script editor very
> helpful.
>
> When trying to get more than one @net.imagej.Dataset input
> parameter however, I noticed some inconsistencies.
> Let me try to illustrate with the two following scripts:
>
> # @DisplayService display
> # @OpService ops
> # @net.imagej.Dataset inputData1
>
> from net.imglib2.meta import ImgPlus
>
> display.createDisplay("my1", ImgPlus(inputData1))
>
>
> The above script re-displays the current image as expected (I
> tried with the Blobs sample image open, which will be
> re-displayed with a non-inverted LUT.)
>
> When I ask for two input datasets (right after a fresh start of
> Fiji with only the Blobs sample image open):
>
> # @DisplayService display
> # @OpService ops
> # @net.imagej.Dataset inputData1
> # @net.imagej.Dataset inputData2
>
> from net.imglib2.meta import ImgPlus
>
> display.createDisplay("my1", ImgPlus(inputData1))
> display.createDisplay("my2", ImgPlus(inputData2))
>
> an error message is displayed: "A Dataset is required but none
> exist."
> The same error message is displayed when I open a second image
> in Fiji before running the script.
>
> Now, when I run script #2 after script #1 was run at least once,
> I get a dialog with two choices "InputData1" and "InputData2",
> both choice fields containing "blobs.gif" and a number of
> "Untitled" entries (where can this title be set, by the way?).
>
> I guess that a choice is only displayed if there are ImageJ2
> datasets (i.e. wrapped ImagePlus) already available. The single
> input case seems to be special-cased as it auto-wraps the
> currently open image.
>
> So how do I proceed to get more than one input in ImageJ2
> scripting from open (ImageJ1-)images?
>
> Thanks for your advice,
> Regards,
> Jan
>
>
> [1]:
> https://github.com/imagej/imagej-legacy/blob/master/src/main/resources/script_templates/Python/OpsThresholdIJ1Analyze.py
>
More information about the ImageJ-devel
mailing list