Jython Scripting

2,072 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
</codesource=== 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.
==== Using openCV in Jython ====It A manual installation is even also possible to use most by putting the jar packages in the jar folder of opencv functionalities within JythonimageJ. They are avalaible on the [https: For that the most simple is to enable the // IJopenCV update site that will automatically download the necessary packagesgithub], which even provides a maven option.
A manual installation ==== Matrices ==== The first thing to know about OpenCV is also possible by putting the jar packages in the jar folder of imageJthat most functions work with an OpenCV matrix object. They are avalaible on Fortunately, the [ IJopenCV github], which even project provides a maven option. '''NB some converters : the version on Github and the update sites are not identical and not compatible'''
The 1st things to know about openCV is that most functions works with openCV matrix object. Hopefully, the IJopenCV provides a converter :
<source lang="python">
#@ ImagePlus ImP
from ijopencv .ij import ImageConverterImagePlusMatConverterfrom ijopencv.opencv import MatImagePlusConverterConverter = ImageConverter() # create an instance of the converterfrom ij import ImagePlus
# Convert ImagePlus (actually the contained ImageProcessor) to a matriceMatrix objectimp2mat = ImagePlusMatConverter()ImCv ImMat = Converterimp2mat.convertTotoMat(imp.getProcessor(ImP))print ImMat
# Do some processing in openCVConvert Matrix object to ImageProcessormat2ip = MatImagePlusConverter()#..NewIP = mat2ip.toImageProcessor(ImMat)# Convert NewImp = ImagePlus("Matrix converted back to an ImagePlus", NewIP)ImP2 = Converter.convertFrom(ImCv)print NewImP
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()
# 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])
print IdTwoColumn = 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 ==
* [[Jython_Scripting_Examples|Jython Scripting Examples]]
* [[ImageJ2_Python_Scripts|ImageJ2 Python Scripts]]
* [ A Fiji Scripting Tutorial by Albert Cardona]
* [ Jython scripting cookbook]
== References ==
<references />