Skip to content, Skip to search


Jython Scripting

1,763 bytes added, 04:03, 11 December 2018
Links: Add aditional link
=== Importing Java module and classes ===
Another great feature of Jython is the possibility to use functions from Java jar package that resides in the jar folder of imageJ.
==== ImageJ and Fiji API ==== The following API documentation lists all available module and functions :
* [ ImageJ]
* [ Fiji]
Let's show one example with the ImageJ package and the class [ RoiManager]. According to the javadoc the RoiManager class resides in <code>ij.plugin.frame</code>. Therefore the code will look like :
<codesource lang="python">
from ij.plugin.frame import RoiManager
RM = RoiManager() # we create an instance of the RoiManager class
rm = RM.getRoiManager() # "activate" the RoiManager otherwise it can behave strangely
==== Using openCV in Jython ====
It is even possible to use most of opencv functionalities within Jython/Fiji. There are several options (see the [ wiki page about opencv]), yet the most straight forward is probably IJ-OpenCV which is available via the update sites. It will automatically download the necessary packages and dependencies in your Fiji installation.
A manual installation is also possible by putting the jar packages in the jar folder of imageJ. They are avalaible on the [ IJopenCV github], which even provides a maven option.
==== Matrices ==== The 1st things first thing to know about openCV OpenCV is that most functions works work with openCV an OpenCV matrix object. HopefullyFortunately, the IJopenCV IJ-OpenCV project provides some converters :
<source lang="python">
from ijopencv.ij import ImagePlusMatConverter
from ijopencv.opencv import MatImagePlusConverter
from ij import ImagePlus
# Convert ImagePlus (actually the contained ImageProcessor) to Matrix object
# Convert Matrix object to ImageProcessor
mat2imp mat2ip = MatImagePlusConverter()NewIP = mat2impmat2ip.toImageProcessor(ImMat)NewImp = ImagePlus("Matrix converted back to ImagePlus", NewIP)print NewIPNewImP
Now to use opencv function, we use the [ JavaCPP API] that contains almost all functions of opencv.
An simple example : creating an identity matrix of size 3x3
<source lang="python">
from org.bytedeco.javacpp.opencv_core import Mat,CvMat, vconcat ## Typical matrices ##
# Identity Matrix of size (3x3) and type 8-bit
Id = Mat().eye(3,3,0).asMat()
print Id
print CvMat(Id) # handy to visualise the matrix
# Matrix of ones (3x3)
One = Mat().ones(3,3,0).asMat()
# Matrix of zeros (3x3)
Zero = Mat().zeros(3,3,0).asMat()
print Id# Custom Matrices# 1D-Matrix can be initialize from a list# For 2D (or more) we have to concatenate 1D-Matrices Row1 = Mat([1,2,3,4,5]) # 1D matrix Row2 = Mat([6,7,8,9,10]) TwoColumn = Mat() # initialise outputvconcat(Col1, Col2, TwoColumn) # output stored in TwoColumnprint CvMat(IdTwoColumn) # nice to visualise the matrix
NB : The <code>org.bytedeco.javacpp.opencv_core.Mat</code> object is different than the <code>org.opencv.core.Mat</code> !! They dont have exactly the same attributes and functions. In Fiji we always use the <code>org.bytedeco.javacpp.opencv_core.Mat</code>.
{{Warning | The <code>org.bytedeco.javacpp.opencv_core.Mat</code> object is different than the <code>org.opencv.core.Mat</code> !! They don't have exactly the same attributes and functions. In Fiji you should always use the objects from <code>org.bytedeco.javacpp</code>.}}  Similarly there is some apparent redudancy for the function in the javacpp API.  ex : Transform exists in 3 different places :
* <code>org.opencv.core.Core.transform</code>
This one takes <code>org.opencv.core.Mat</code> as input. It is currently challenging to have such object in Fiji.
* <code>org.bytedeco.javacpp.opencv_core.transform</code>
That's the one to use ! It takes only <code>org.bytedeco.javacpp.opencv_core.Mat</code> as input, which is the most approriate in Fiji/Jython
==== Scalar ====
In addition to Matrices, opencv allows to use Scalar objects
A scalar is a 4 item element (v0, v1, v2, v3).
If v1=v2=v3=0 then the Scalar is real.
<source lang="python">
from org.bytedeco.javacpp.opencv_core import Scalar
# Real scalar can be initiated with a float parameters
Number = Scalar(5.0)
Number = Scalar(float(5))
print Number
# Using an integer as parameter has a different meaning
Empty = Scalar(5) # This initiate an empty Scalar object of size 5
print Empty
# Alternatively one can set the other values of the Scalar
Complex = Scalar(1,2,3,4)
print Complex
==== Operations ====
It is possible to perform some operations between matrices, or between Scalar and matrices.
<source lang="python">
from org.bytedeco.javacpp.opencv_core import Scalar, Mat, subtract
A = Mat([1,2,3,4,5])
B = Mat([1,2,-3,-4,0])
Number = Scalar(10.0)
## Number - B ( B-Number is also possible)
Expr = subtract(Number,B)
print CvMat(Expr.asMat())
## A - B
Out = Mat()
print CvMat(Out)
== Self written Jython modules for ImageJ ==
* [[ImageJ2_Python_Scripts|ImageJ2 Python Scripts]]
* [ A Fiji Scripting Tutorial by Albert Cardona]
* [ Jython scripting cookbook]
== References ==
<references />