User Tools

Site Tools


documents:120206pyip_cooking:python_imagej_cookbook

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
documents:120206pyip_cooking:python_imagej_cookbook [2022/03/02 07:15] – [Plugin 3D ImageJ Suite] kotadocuments:120206pyip_cooking:python_imagej_cookbook [2022/10/16 07:12] (current) – [Using Java8 Stream] kota
Line 787: Line 787:
 zip command creates a list of tuples from elements of arrays a and b. zip command creates a list of tuples from elements of arrays a and b.
  
 +==== Using Java8 Stream ====
 +
 +Stream-related syntax introduced from Java8 is useful for writing clear codes, but cannot be directly used in Jython. Below is a way to use StreamAPI, by introducing Jython classes implementing the Consumer interface. I took this idea from [[https://stackoverflow.com/questions/45417732/jython-function-to-java-consumer|here]]. For the Java Stream API, this page is useful: [[https://www.baeldung.com/java-8-streams|The Java 8 Stream API Tutorial]]
 +
 +<code python>
 +from java.util.Arrays import asList
 +from java.util.function import Predicate, Consumer, Function
 +from java.util.stream import Collectors
 +from java.util import Arrays
 +
 +
 +class jc(Consumer):
 +    def __init__(self, fn):
 +        self.accept=fn
 +
 +class jf(Function):
 +    def __init__(self, fn):
 +        self.apply = fn
 +
 +class jp(Predicate):
 +    def __init__(self, fn):
 +        self.test = fn
 +        
 +def jprint(x):
 + print x
 +
 +tt = ["a", "b", "c"]
 +c = Arrays.stream(tt).count()
 +print c
 +
 +print "forEach printing"
 +Arrays.stream(tt).forEach(jc(lambda x: jprint("="+x)))
 +
 +print "forEach printing parallelly"
 +Arrays.stream(tt).parallel().forEach(jc(lambda x: jprint("="+x)))
 +
 +print "has b?", Arrays.stream(tt).anyMatch(jp(lambda x: x=="b"))
 +print "has z?", Arrays.stream(tt).anyMatch(jp(lambda x: x=="z"))
 +
 +# convert to Java List<>
 +jtt = Arrays.asList(tt)
 +
 +jtt.stream().forEach(jc(lambda x: jprint("+"+x)))
 +</code>
 ===== Event Listener ===== ===== Event Listener =====
  
Line 839: Line 883:
 </code> </code>
  
 +===== GUI: wait for user =====
 +
 +To pause the script processing and wait for the user input (e.g. creating amanual ROI), use WaitForUserDialog class. 
 +
 +<code python>
 +from ij.gui import WaitForUserDialog
 +
 +print("start")
 +wud = WaitForUserDialog("test: wait for user", "Click OK if you are done with your manual work")
 +print("waiting...")
 +wud.show()
 +print("done")
 +</code>
  
 ===== HashMap ===== ===== HashMap =====
Line 1023: Line 1080:
 maskimp.show() maskimp.show()
 </code> </code>
 +
 +=== Stack to Mask by a threshold value ===
 +
 +Here is an example script to create a mask from an 8-bit stack using intensity thresholding. 
 +The threshold value is derived by the Otsu algorithm using the full stack histogram. 
 +
 +<code>
 +from ij import IJ, ImagePlus, ImageStack
 +from ij.plugin import ChannelSplitter
 +from ij.process import StackStatistics
 +from fiji.threshold import Auto_Threshold
 +
 +#imp = IJ.openImage("http://imagej.nih.gov/ij/images/confocal-series.zip")
 +imp = IJ.getImage()
 +imps = ChannelSplitter.split( imp )
 +imp1 = imps[0] 
 +imp1bin = imp1.duplicate()
 +
 +# get auto threshold value
 +stats = StackStatistics(imp1bin)
 +histdouble = stats.histogram()
 +
 +# need this conversion from double to int
 +histint = map(lambda x:int(x), histdouble)
 +th = Auto_Threshold.Otsu(histint)
 +
 +for i in range(imp1bin.getStackSize()):
 + ip = imp1bin.getStack().getProcessor( i + 1)
 + ip.threshold(th)
 +
 +IJ.run(imp1bin, "Grays", "");
 +imp1bin.show()
 +</code>
 +
 +To do this by accessing the pixel array of the stack, here is the way. It takes a longer time than above, so this is just to show the technique to process by pixel values using float processor pixel array object. 
 +
 +<code python>
 +
 +from ij import IJ, ImagePlus, ImageStack
 +from ij.plugin import ChannelSplitter
 +from ij.process import StackStatistics
 +from ij.process import FloatProcessor
 +from fiji.threshold import Auto_Threshold
 +import jarray
 +
 +imp = IJ.openImage("http://imagej.nih.gov/ij/images/confocal-series.zip")
 +#imp = IJ.getImage()
 +imps = ChannelSplitter.split( imp )
 +imp1 = imps[0] 
 +ww = imp1.getWidth()
 +hh = imp1.getHeight()
 +binstack = ImageStack( ww, hh)
 +
 +# get auto threshold value
 +stats = StackStatistics(imp1)
 +histdouble = stats.histogram()
 +histint = map(lambda x:int(x), histdouble)
 +th = Auto_Threshold.Otsu(histint)
 +
 +for i in range(imp1.getStackSize()):
 + slicepixA = imp1.getStack().duplicate().convertToFloat().getPixels(i + 1)
 +# pixmin = reduce(min, slicepixA)
 +# pixmax = reduce(max, slicepixA)
 +# print "pixvalue range:", pixmin, " - " ,pixmax
 + slicepixA = map(lambda x: 0.0 if x<th else 255.0, slicepixA)
 + fp = FloatProcessor( ww, hh, slicepixA, None)
 + bp = fp.convertToByteProcessor()
 + binstack.addSlice(str(i+1), bp)
 +
 +binimp = ImagePlus("bin", binstack)
 +binimp.show()
 +</code>
 +
  
 ==== ROI manager ==== ==== ROI manager ====
Line 1819: Line 1949:
 fullimps[0].show() fullimps[0].show()
 </code> </code>
 +
 +If you do not want to open all images (called sereies) in multi-image CZI files, replace 
 +<code>
 +open.setOpenAllSeries(True) 
 +</code>
 +with 
 +<code>
 +options.setSeriesOn(seriesIndex, True)
 +</code>
 +with "sereiesIndex" being the seriesID e.g. 1 or 2 or 3 ... 
  
 See here for more on metadata parsing and so on: [[https://gist.github.com/ctrueden/6282856|bio-formats.py]] See here for more on metadata parsing and so on: [[https://gist.github.com/ctrueden/6282856|bio-formats.py]]
Line 2241: Line 2381:
 ===== Plugin: MorphoLibJ ===== ===== Plugin: MorphoLibJ =====
  
 +Javadoc: [[http://ijpb.github.io/MorphoLibJ/javadoc/]]
 ==== Distance Transform Watershed 3D ==== ==== Distance Transform Watershed 3D ====
  
Line 2504: Line 2645:
 ===== JAVADOCS ===== ===== JAVADOCS =====
  
-  * 3D ImageJ Suite [[http://wiki.cmci.info/javaapi/mcib-javadoc/|JAVADOC]] (2019 version)+  * 3D ImageJ Suite  
 +    * [[http://wiki.cmci.info/javaapi/mcib-javadoc/|JAVADOC]] (2019 version, deprecated) 
 +    * [[https://wiki.cmci.info/mcib-javadoc/| MCIB3D Javadoc]] (2022 version)
     * [[https://github.com/mcib3d/mcib3d-core|Core Source (old)]]      * [[https://github.com/mcib3d/mcib3d-core|Core Source (old)]] 
     * [[https://framagit.org/mcib3d/mcib3d-core|Core Source (2021-)]]     * [[https://framagit.org/mcib3d/mcib3d-core|Core Source (2021-)]]
documents/120206pyip_cooking/python_imagej_cookbook.1646205353.txt.gz · Last modified: 2022/03/02 07:15 by kota

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki