Hi all,

some follow-up questions regarding imagej-ops:

I tried to use some basic ops in python. From the 2014 wiki announcement [1] and the python template [2], I assumed something like this would work in python:

    # @OpService ops
    # @DisplayService display

    blank = ops.create([100, 50])

    display.createDisplay(blank)

But a choice of candidate functions is listed in output:

**********************************************
Request:
-       createimg(
                Integer,
                Integer)

Candidates:
1.      (Img output) =
        net.imagej.ops.create.DefaultCreateImg(
==>          Type outType?,
                ImgFactory fac?,
                long[] dims)
Inconvertible type: java.lang.Integer => net.imglib2.type.Type<capture of ?>
2.      (ImgPlus output) =
        net.imagej.ops.create.CreateEmptyImgCopy(
                ImgPlus input)
        Too many arguments: 2 > 1
3.      (Img output) =
        net.imagej.ops.create.CreateImgNativeType(
                ImgFactory fac,
                NativeType outType,
                Dimensions dims)
        Not enough arguments: 2 < 3
4.      (Img output) =
        net.imagej.ops.create.CreateImgDifferentNativeType(
==>          Img input,
                NativeType type)
        Inconvertible type: java.lang.Integer => net.imglib2.img.Img<capture of 
?>
5.      (ImgPlus output) =
        net.imagej.ops.create.CreateEmptyImgPlusCopy(
                ImgPlus input)
        Too many arguments: 2 > 1
**********************************************

and I am unsure if I have to provide image type and factory here.


Similarly, for the subtract op:

    # @OpService ops
    # @StatisticsService stats
    # @net.imagej.Dataset inData
    # @OUTPUT net.imagej.Dataset outData

    outData = inData.duplicate()

    mean = stats.alphaTrimmedMean(inData, 0)
    print mean

    ops.subtract(outData, inData, mean)

I am getting the following list of candidates:

**********************************************
Request:
-       math.subtract(
                DefaultDataset,
                DefaultDataset,
                Double)

Candidates:
1.      (Object result) =
        net.imagej.ops.onthefly.ArithmeticOp$SubtractOp(
                Object result,
                Object a,
                Object b)
        Inputs do not conform to op rules
                result = blobs.gif
                a = blobs.gif
                b = 103.26857775590551
2.      (int result) =
        net.imagej.ops.math.PrimitiveMath$IntegerSubtract(
                int a,
                int b)
        Too many arguments: 3 > 2
3.      (long result) =
        net.imagej.ops.math.PrimitiveMath$LongSubtract(
                long a,
                long b)
        Too many arguments: 3 > 2
4.      (float result) =
        net.imagej.ops.math.PrimitiveMath$FloatSubtract(
                float a,
                float b)
        Too many arguments: 3 > 2
5.      (double result) =
        net.imagej.ops.math.PrimitiveMath$DoubleSubtract(
                double a,
                double b)
        Too many arguments: 3 > 2
6.      (RealType out) =
        net.imagej.ops.arithmetic.real.RealSubtract(
==>          RealType out,
                RealType in,
                double constant)
        Inconvertible type: net.imagej.DefaultDataset => capture of ?
**********************************************

is there a way with the type-unsafe scripting languages to get ops to use the correct function? Or am I misunderstanding the concept of imagej-ops here?

Thanks again for any hints.

Jan


[1] http://fiji.sc/2014-04-04_-_Announcing_ImageJ_OPS
[2] https://github.com/imagej/imagej-legacy/blob/master/src/main/resources/script_templates/Python/OpsThresholdIJ1Analyze.py


On 28.04.2015 09:03, Jan Eglinger wrote:
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 <hi...@wisc.edu
<mailto:hi...@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.eglin...@gmail.com <mailto:jan.eglin...@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



_______________________________________________
ImageJ-devel mailing list
ImageJ-devel@imagej.net
http://imagej.net/mailman/listinfo/imagej-devel

Reply via email to