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/10/03 17:28] – [Threshold to create a mask (Binary)] 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 1039: Line 1083:
 === Stack to Mask by a threshold value === === Stack to Mask by a threshold value ===
  
-Here is an example of using pixel array to binarize an 8-bit stack. +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.  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> <code python>
Line 2307: Line 2381:
 ===== Plugin: MorphoLibJ ===== ===== Plugin: MorphoLibJ =====
  
 +Javadoc: [[http://ijpb.github.io/MorphoLibJ/javadoc/]]
 ==== Distance Transform Watershed 3D ==== ==== Distance Transform Watershed 3D ====
  
documents/120206pyip_cooking/python_imagej_cookbook.1664818088.txt.gz · Last modified: 2022/10/03 17:28 by kota

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki