ImageJ and Python integration

fiji
imagej
plugin

#1

I have a code in python 3.7 and i need to import it as a plugin in Imagej. What should i do?


#2

Morning :slight_smile:have a look at this thread for a start:


There’s quite a bit of discussion here on the forum, did you search on ‘python’?


#3

You can have a look https://github.com/imglib/imglyb, A bridge connect imglib and numpy.

And you can try or contribute to https://github.com/Image-Py/imagepy, A framework like ImageJ in Python. There is not many plugins as rich as ImageJ/Fiji now. But you can use numpy/skimage/opencv directly.

And in the future, I would do some work that try to access scijava in ImagePy,


#4

Thank you Danielle_Z. I did look there.
Executing Imagej package functions always ends up raising exceptions like

"raise ImportError(‘Unable to import scyjava dependency jnius.’)
ImportError: Unable to import scyjava dependency jnius."

Is there a problem with jnius module?


#5

I’m afraid l can’t help. Perhaps a search on that module and python could point you to some folk who you could address specifically.

Myself I’m keen to start combining ImageJ and python too, but I’m rather green in that area right now.


#6

@dinesh_kumar,

Are you using conda?

Can you be more specific about the steps you took to get set up?
(I presume you’re trying pyimagej but its not clear…)

John


#7

No i am using Python idle, though i think i will get the same error while using conda too.
Steps:
I downloaded the imagej package in python (yes it is pyimagej).
It had certain prerequisites like scyjava and imglyb and jnius. So i also downloaded both the packages too.

this is the exact error i get when i run a function in Imagej package. Is there anything i could do?


#8

@dinesh_kumar,

That’s helpful. Looking at this part of the error message:

PYJNIUS_JAR environment variable not defined

it looks like you’re missing an environment variable which tells imglyb where to find the pyjnius jar.

Make sure you followed all the steps for installing imglyb
Especially this part which shows you how to set the environment variables imglyb needs.

:: Set the appropriate environment variables:
SET "PYJNIUS_JAR=path\to\pyjnius\pyjnius.jar"
SET "JAVA_HOME=path\to\jdk"
SET "JDK_HOME=%JAVA_HOME%"

John


#9

I feel the quickest and simplest (80-20) way to get something going is to just use subprocess in Python and execute the appropriate command line.

First make your macro and save as macro.ijm. You can build a template but just doing Plugins > Macros > Record in Fiji and copying out what you need from your image operations. Put that in a file or construct a function which generates the macro just as you would writing to a text file (useful for iterating through different datasets, for example). Then just run the following:

import subprocess
fiji_path = "/path/to/Fiji.app"
macro_file = "macro.ijm"
fiji_cmd = " ".join([fiji_path, "--headless", "-macro", macro_file])
subprocess.call(fiji_cmd, shell=True)

The only thing to be aware of is the use of double or single quotes. As an example, say you want to subtract background for a list of files in a folder which have a certain string:

def generate_macro(input_dir,output_dir,unique_identifier):  
    params_list = [
            "setBatchMode(true);",
            "list = getFileList('%s');" % input_dir,
            "for (i = 0; i < list.length; i++) {",
            "    idx = indexOf( list[i], '%s' );" % unique_identifier,
            "    if ( idx >= 0 ){",
            "        print(list[i]);",
            "        open('%s' + list[i]);"% input_dir,
            "        run('Subtract Background...', 'rolling=50');",
            "        saveAs('Tiff','%s' + list[i]);" % output_dir,
            "        close();",
            "        }",
            "}",
            "setBatchMode(false);",
            ]
    macro_params = "\n".join(params_list)
    return macro_params

Then you just write this to file:

macro_params = generate_macro(*args)
f = open("macro.ijm")
f.write(macro_params)
f.close()

Now you can call it from subprocess as above. Good luck.