<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<protocol VERSION="4">
<blocks>
<workflow ID="1565867364" blockType="plugins.adufour.blocks.lang.FolderLoop" className="plugins.adufour.blocks.lang.FolderLoop" collapsed="false" height="888" width="1457" xLocation="0" yLocation="0">
<blocks>
<block ID="1553572636" blockType="plugins.adufour.blocks.tools.io.FileToSequence" className="plugins.adufour.blocks.tools.io.FileToSequence" height="83" width="188" xLocation="208" yLocation="51">
<variables>
<input>
<variable ID="input file" name="input file" runtime="false" visible="false"/>
</input>
<output>
<variable ID="sequence" name="sequence" runtime="false" visible="false"/>
</output>
</variables>
</block>
<block ID="305431902" blockType="plugins.adufour.blocks.tools.input.Integer" className="plugins.adufour.blocks.tools.input.Integer" height="64" width="139" xLocation="36" yLocation="589">
<variables>
<input>
<variable ID="integer" name="integer" runtime="false" value="0" visible="false"/>
</input>
<output/>
</variables>
</block>
<block ID="1032292400" blockType="plugins.adufour.blocks.tools.input.Integer" className="plugins.adufour.blocks.tools.input.Integer" height="64" width="139" xLocation="34" yLocation="671">
<variables>
<input>
<variable ID="integer" name="integer" runtime="false" value="0" visible="false"/>
</input>
<output/>
</variables>
</block>
<block ID="1793127812" blockType="plugins.tprovoost.scripteditor.scriptblock.Javascript" className="plugins.tprovoost.scripteditor.scriptblock.Javascript" height="382" width="493" xLocation="21" yLocation="193">
<variables>
<input>
<variable ID="Script" name="Script" runtime="false" value="importClass(Packages.plugins.fab.invert.Invert)&#10;importClass(Packages.icy.sequence.Sequence)&#10;importClass(Packages.icy.image.IcyBufferedImageUtil)&#10;importClass(Packages.java.awt.image.BufferedImage)&#10;&#10;newx = input1&#10;newy = input2&#10;&#10;image = input0.getFirstImage()&#10;// rescale for faster processing&#10;if ((newx != 0) &amp;&amp; (newy != 0))&#10;&#9;image = IcyBufferedImageUtil.scale(image, 1024, 768)&#10;&#9;&#10;// convert to gray&#10;gray_image = IcyBufferedImageUtil.toBufferedImage(image, BufferedImage.TYPE_BYTE_GRAY, null)&#10;// set new image converted to gray&#10;input0.setImage(0, 0, gray_image)&#10;output0 = input0&#10;// invert&#10;Invert.invert(output0)&#10;&#10;" visible="false"/>
<variable ID="Add Input" name="Add Input" runtime="false" value="2" visible="false"/>
<variable ID="Add output" name="Add output" runtime="false" value="0" visible="false"/>
<variable ID="input0" name="input0" runtime="false" type="icy.sequence.Sequence" visible="false"/>
<variable ID="420794350" name="input1" runtime="true" type="int" visible="false"/>
<variable ID="25061579" name="input2" runtime="true" type="int" visible="false"/>
</input>
<output>
<variable ID="output0" name="output0" runtime="false" type="icy.sequence.Sequence" visible="false"/>
</output>
</variables>
</block>
<block ID="1055970313" blockType="plugins.adufour.filtering.GaussianFilter" className="plugins.adufour.filtering.FilterToolbox" height="158" width="204" xLocation="433" yLocation="11">
<variables>
<input>
<variable ID="input" name="input" runtime="false" visible="false"/>
<variable ID="filterX" name="sigma (x)" runtime="false" value="3.0" visible="false"/>
<variable ID="filterY" name="sigma (y)" runtime="false" value="3.0" visible="false"/>
<variable ID="filterZ" name="sigma (z)" runtime="false" value="0.0" visible="false"/>
</input>
<output>
<variable ID="output" name="output" runtime="false" visible="false"/>
</output>
</variables>
</block>
<block ID="844957026" blockType="plugins.adufour.blocks.tools.input.Integer" className="plugins.adufour.blocks.tools.input.Integer" height="64" width="139" xLocation="342" yLocation="663">
<variables>
<input>
<variable ID="integer" name="integer" runtime="false" value="10000" visible="false"/>
</input>
<output/>
</variables>
</block>
<block ID="948063760" blockType="plugins.adufour.blocks.tools.input.Integer" className="plugins.adufour.blocks.tools.input.Integer" height="64" width="139" xLocation="342" yLocation="727">
<variables>
<input>
<variable ID="integer" name="integer" runtime="false" value="0" visible="false"/>
</input>
<output/>
</variables>
</block>
<block ID="1781883665" blockType="plugins.tprovoost.scripteditor.scriptblock.Javascript" className="plugins.tprovoost.scripteditor.scriptblock.Javascript" height="577" width="489" xLocation="539" yLocation="190">
<variables>
<input>
<variable ID="Script" name="Script" runtime="false" value="importClass(Packages.icy.roi.ROI2DArea)&#10;importClass(Packages.plugins.adufour.thresholder.Thresholder)&#10;importClass(Packages.plugins.adufour.thresholder.KMeans)&#10;&#10;edge_size = 20&#10;minimum_object_size = input1&#10;display = input2&#10;&#10;// computes the kmeans thresholds for automatic thresholding&#10;kmeans = KMeans.computeKMeansThresholds(input0, 2)&#10;// performs the threshold and get ROI result&#10;rois = Thresholder.threshold(input0, 0, kmeans)&#10;r = rois[0]&#10;mask = r.getBooleanMask2D(0, 0, 0, true)&#10;objects = mask.getComponents()&#10;&#10;for(i = 0; i &lt; objects.length; i++)&#10;{&#10;&#9;object = objects[i]&#10;&#9;roi = new ROI2DArea(object)&#10;&#10;&#9;// eliminate object on edge&#10;&#9;if (roi.getBounds2D().getMaxX() &gt; (input0.getSizeX() - edge_size))&#10;&#9;&#9;continue&#10;&#9;if (roi.getBounds2D().getMinX() &lt; (0 + edge_size))&#10;&#9;&#9;continue&#10;&#9;// eliminate object on edge&#10;&#9;if (roi.getBounds2D().getMaxY() &gt; (input0.getSizeY() - edge_size))&#10;&#9;&#9;continue&#10;&#9;if (roi.getBounds2D().getMinY() &lt; (0 + edge_size))&#10;&#9;&#9;continue&#10;&#10;&#9;// ignore small object&#10;&#9;pts = object.getPointsAsIntArray()&#10;&#9;if (pts.length &lt; (minimum_object_size / 2))&#10;&#9;&#9;continue&#10;&#10;&#9;input0.addROI(roi)&#10;}&#10;&#10;output0 = input0&#10;if (display != 0) gui.addSequence(output0)" visible="false"/>
<variable ID="Add Input" name="Add Input" runtime="false" value="2" visible="false"/>
<variable ID="Add output" name="Add output" runtime="false" value="0" visible="false"/>
<variable ID="input0" name="input0" runtime="false" type="icy.sequence.Sequence" visible="false"/>
<variable ID="1500629647" name="input1" runtime="true" type="int" visible="false"/>
<variable ID="1180067470" name="input2" runtime="true" type="int" visible="false"/>
</input>
<output>
<variable ID="output0" name="output0" runtime="false" type="icy.sequence.Sequence" visible="false"/>
</output>
</variables>
</block>
<block ID="1262823049" blockType="plugins.adufour.blocks.tools.input.Decimal" className="plugins.adufour.blocks.tools.input.Decimal" height="64" width="146" xLocation="874" yLocation="100">
<variables>
<input>
<variable ID="decimal" name="decimal" runtime="false" value="10.0" visible="false"/>
</input>
<output/>
</variables>
</block>
<block ID="370114174" blockType="plugins.adufour.blocks.tools.input.Decimal" className="plugins.adufour.blocks.tools.input.Decimal" height="64" width="146" xLocation="885" yLocation="36">
<variables>
<input>
<variable ID="decimal" name="decimal" runtime="false" value="20.0" visible="false"/>
</input>
<output/>
</variables>
</block>
<block ID="2090341009" blockType="plugins.tprovoost.scripteditor.scriptblock.Javascript" className="plugins.tprovoost.scripteditor.scriptblock.Javascript" height="443" width="381" xLocation="1063" yLocation="201">
<variables>
<input>
<variable ID="Script" name="Script" runtime="false" value="importClass(Packages.icy.type.rectangle.Rectangle5D)&#10;rois = input0.getROIs()&#10;&#10;if (rois.size() &gt;= 2)&#10;{&#10;  &#9;ref = rois.get(0)&#10;  &#9;obj = rois.get(1)&#10;&#10;  &#9;refBnd = ref.getBounds5D()&#10;&#9;objBnd = obj.getBounds5D()&#10;&#10;  &#9;// exchange ref and object&#10;&#9;if (refBnd.getCenterY() &lt; objBnd.getCenterY())&#10;&#9;{&#10;  &#9;&#9;tmp = refBnd&#10;  &#9;&#9;refBnd = objBnd&#10;  &#9;&#9;objBnd = tmp&#10;&#9;}&#10;&#10;&#9;objSizeX = (objBnd.getSizeX() / refBnd.getSizeX()) * input1&#10;&#9;objSizeY = (objBnd.getSizeY() / refBnd.getSizeY()) * input2&#10;&#10;  &#9;println(input0.getName() + &quot;\t&quot; + objSizeX + &quot;\t&quot; + objSizeY)&#10;}" visible="false"/>
<variable ID="Add Input" name="Add Input" runtime="false" value="3" visible="false"/>
<variable ID="Add output" name="Add output" runtime="false" value="0" visible="false"/>
<variable ID="input0" name="input0" runtime="false" type="icy.sequence.Sequence" visible="false"/>
<variable ID="1445909491" name="input1" runtime="true" type="double" visible="false"/>
<variable ID="172149743" name="input2" runtime="true" type="double" visible="false"/>
<variable ID="1568282142" name="input3" runtime="true" type="java.lang.Object" value="class java.lang.Object" visible="false"/>
</input>
<output>
<variable ID="output0" name="output0" runtime="false" type="java.lang.Object" visible="false"/>
</output>
</variables>
</block>
</blocks>
<links>
<link dstBlockID="1553572636" dstVarID="input file" srcBlockID="1565867364" srcVarID="file"/>
<link dstBlockID="1055970313" dstVarID="input" srcBlockID="1793127812" srcVarID="output0" srcVarType="icy.sequence.Sequence"/>
<link dstBlockID="1781883665" dstVarID="input0" srcBlockID="1055970313" srcVarID="output"/>
<link dstBlockID="2090341009" dstVarID="1445909491" srcBlockID="370114174" srcVarID="decimal"/>
<link dstBlockID="2090341009" dstVarID="172149743" srcBlockID="1262823049" srcVarID="decimal"/>
<link dstBlockID="2090341009" dstVarID="input0" srcBlockID="1781883665" srcVarID="output0" srcVarType="icy.sequence.Sequence"/>
<link dstBlockID="1781883665" dstVarID="1500629647" srcBlockID="844957026" srcVarID="integer"/>
<link dstBlockID="1781883665" dstVarID="1180067470" srcBlockID="948063760" srcVarID="integer"/>
<link dstBlockID="1793127812" dstVarID="input0" srcBlockID="1553572636" srcVarID="sequence"/>
<link dstBlockID="1793127812" dstVarID="420794350" srcBlockID="305431902" srcVarID="integer"/>
<link dstBlockID="1793127812" dstVarID="25061579" srcBlockID="1032292400" srcVarID="integer"/>
</links>
<variables>
<input>
<variable ID="folder" blockID="1565867364" visible="false"/>
<variable ID="extension" blockID="1565867364" value="JPG" visible="false"/>
<variable ID="1553572636:input file" blockID="1553572636" visible="false"/>
<variable ID="1793127812:Script" blockID="1793127812" value="importClass(Packages.plugins.fab.invert.Invert)&#10;importClass(Packages.icy.sequence.Sequence)&#10;importClass(Packages.icy.image.IcyBufferedImageUtil)&#10;importClass(Packages.java.awt.image.BufferedImage)&#10;&#10;newx = input1&#10;newy = input2&#10;&#10;image = input0.getFirstImage()&#10;// rescale for faster processing&#10;if ((newx != 0) &amp;&amp; (newy != 0))&#10;&#9;image = IcyBufferedImageUtil.scale(image, 1024, 768)&#10;&#9;&#10;// convert to gray&#10;gray_image = IcyBufferedImageUtil.toBufferedImage(image, BufferedImage.TYPE_BYTE_GRAY, null)&#10;// set new image converted to gray&#10;input0.setImage(0, 0, gray_image)&#10;output0 = input0&#10;// invert&#10;Invert.invert(output0)&#10;&#10;" visible="false"/>
<variable ID="1793127812:Add Input" blockID="1793127812" value="2" visible="false"/>
<variable ID="1793127812:Add output" blockID="1793127812" value="0" visible="false"/>
<variable ID="1793127812:input0" blockID="1793127812" value="" visible="false"/>
<variable ID="1055970313:input" blockID="1055970313" visible="false"/>
<variable ID="1055970313:filterX" blockID="1055970313" value="3.0" visible="false"/>
<variable ID="1055970313:filterY" blockID="1055970313" value="3.0" visible="false"/>
<variable ID="1055970313:filterZ" blockID="1055970313" value="0.0" visible="false"/>
<variable ID="1781883665:Script" blockID="1781883665" value="importClass(Packages.icy.roi.ROI2DArea)&#10;importClass(Packages.plugins.adufour.thresholder.Thresholder)&#10;importClass(Packages.plugins.adufour.thresholder.KMeans)&#10;&#10;edge_size = 20&#10;minimum_object_size = input1&#10;display = input2&#10;&#10;// computes the kmeans thresholds for automatic thresholding&#10;kmeans = KMeans.computeKMeansThresholds(input0, 2)&#10;// performs the threshold and get ROI result&#10;rois = Thresholder.threshold(input0, 0, kmeans)&#10;r = rois[0]&#10;mask = r.getBooleanMask2D(0, 0, 0, true)&#10;objects = mask.getComponents()&#10;&#10;for(i = 0; i &lt; objects.length; i++)&#10;{&#10;&#9;object = objects[i]&#10;&#9;roi = new ROI2DArea(object)&#10;&#10;&#9;// eliminate object on edge&#10;&#9;if (roi.getBounds2D().getMaxX() &gt; (input0.getSizeX() - edge_size))&#10;&#9;&#9;continue&#10;&#9;if (roi.getBounds2D().getMinX() &lt; (0 + edge_size))&#10;&#9;&#9;continue&#10;&#9;// eliminate object on edge&#10;&#9;if (roi.getBounds2D().getMaxY() &gt; (input0.getSizeY() - edge_size))&#10;&#9;&#9;continue&#10;&#9;if (roi.getBounds2D().getMinY() &lt; (0 + edge_size))&#10;&#9;&#9;continue&#10;&#10;&#9;// ignore small object&#10;&#9;pts = object.getPointsAsIntArray()&#10;&#9;if (pts.length &lt; (minimum_object_size / 2))&#10;&#9;&#9;continue&#10;&#10;&#9;input0.addROI(roi)&#10;}&#10;&#10;output0 = input0&#10;if (display != 0) gui.addSequence(output0)" visible="false"/>
<variable ID="1781883665:Add Input" blockID="1781883665" value="2" visible="false"/>
<variable ID="1781883665:Add output" blockID="1781883665" value="0" visible="false"/>
<variable ID="1781883665:input0" blockID="1781883665" value="" visible="false"/>
<variable ID="1262823049:decimal" blockID="1262823049" value="10.0" visible="false"/>
<variable ID="370114174:decimal" blockID="370114174" value="20.0" visible="false"/>
<variable ID="2090341009:Script" blockID="2090341009" value="importClass(Packages.icy.type.rectangle.Rectangle5D)&#10;rois = input0.getROIs()&#10;&#10;if (rois.size() &gt;= 2)&#10;{&#10;  &#9;ref = rois.get(0)&#10;  &#9;obj = rois.get(1)&#10;&#10;  &#9;refBnd = ref.getBounds5D()&#10;&#9;objBnd = obj.getBounds5D()&#10;&#10;  &#9;// exchange ref and object&#10;&#9;if (refBnd.getCenterY() &lt; objBnd.getCenterY())&#10;&#9;{&#10;  &#9;&#9;tmp = refBnd&#10;  &#9;&#9;refBnd = objBnd&#10;  &#9;&#9;objBnd = tmp&#10;&#9;}&#10;&#10;&#9;objSizeX = (objBnd.getSizeX() / refBnd.getSizeX()) * input1&#10;&#9;objSizeY = (objBnd.getSizeY() / refBnd.getSizeY()) * input2&#10;&#10;  &#9;println(input0.getName() + &quot;\t&quot; + objSizeX + &quot;\t&quot; + objSizeY)&#10;}" visible="false"/>
<variable ID="2090341009:Add Input" blockID="2090341009" value="3" visible="false"/>
<variable ID="2090341009:Add output" blockID="2090341009" value="0" visible="false"/>
<variable ID="2090341009:input0" blockID="2090341009" value="" visible="false"/>
<variable ID="2090341009:1445909491" blockID="2090341009" value="" visible="false"/>
<variable ID="2090341009:172149743" blockID="2090341009" value="" visible="false"/>
<variable ID="2090341009:1568282142" blockID="2090341009" value="class java.lang.Object" visible="false"/>
<variable ID="1781883665:1500629647" blockID="1781883665" value="" visible="false"/>
<variable ID="948063760:integer" blockID="948063760" value="0" visible="false"/>
<variable ID="844957026:integer" blockID="844957026" value="10000" visible="false"/>
<variable ID="1781883665:1180067470" blockID="1781883665" value="" visible="false"/>
<variable ID="305431902:integer" blockID="305431902" value="0" visible="false"/>
<variable ID="1032292400:integer" blockID="1032292400" value="0" visible="false"/>
<variable ID="1793127812:420794350" blockID="1793127812" value="" visible="false"/>
<variable ID="1793127812:25061579" blockID="1793127812" value="" visible="false"/>
</input>
<output>
<variable ID="iteration" blockID="1565867364" visible="false"/>
<variable ID="file" blockID="1565867364" visible="false"/>
<variable ID="1553572636:sequence" blockID="1553572636" visible="false"/>
<variable ID="1793127812:output0" blockID="1793127812" visible="false"/>
<variable ID="1055970313:output" blockID="1055970313" visible="false"/>
<variable ID="1781883665:output0" blockID="1781883665" visible="false"/>
<variable ID="2090341009:output0" blockID="2090341009" visible="false"/>
</output>
</variables>
</workflow>
</blocks>
<links/>
</protocol>
