changeset 7:e5c8e7e72373 draft

planemo upload for repository https://github.com/BMCV/galaxy-image-analysis/tree/master/tools/2d_auto_threshold/ commit c045f067a57e8308308cf6329060c7ccd3fc372f
author imgteam
date Thu, 04 Apr 2024 15:23:18 +0000
parents 8bccb36e055a
children 699a5e9146b3
files auto_threshold.py auto_threshold.xml creators.xml test-data/out.tif test-data/out1.tif test-data/out2.tif test-data/out3.tif test-data/out4.tif test-data/rgb.png tests.xml
diffstat 10 files changed, 168 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/auto_threshold.py	Wed Mar 13 06:15:54 2024 +0000
+++ b/auto_threshold.py	Thu Apr 04 15:23:18 2024 +0000
@@ -27,23 +27,28 @@
 }
 
 
-def do_thresholding(in_fn, out_fn, th_method, block_size=5, threshold=0, invert_output=False):
+def do_thresholding(in_fn, out_fn, th_method, block_size, offset, threshold, invert_output=False):
     img = skimage.io.imread(in_fn)
-    th = th_methods[th_method](img_raw=img, bz=block_size, thres=threshold)
+    img = np.squeeze(img)
+    assert img.ndim == 2
+
+    th = offset + th_methods[th_method](img_raw=img, bz=block_size, thres=threshold)
     res = img > th
     if invert_output:
         res = np.logical_not(res)
+
     tifffile.imwrite(out_fn, skimage.util.img_as_ubyte(res))
 
 
 if __name__ == "__main__":
-    parser = argparse.ArgumentParser(description='Automatic Image Thresholding')
+    parser = argparse.ArgumentParser(description='Automatic image thresholding')
     parser.add_argument('im_in', help='Path to the input image')
-    parser.add_argument('im_out', help='Path to the output image (TIFF)')
+    parser.add_argument('im_out', help='Path to the output image (uint8)')
     parser.add_argument('th_method', choices=th_methods.keys(), help='Thresholding method')
     parser.add_argument('block_size', type=int, default=5, help='Odd size of pixel neighborhood for calculating the threshold')
-    parser.add_argument('threshold', type=float, default=0, help='Manual thresholding value')
+    parser.add_argument('offset', type=float, default=0, help='Offset of automatically determined threshold value')
+    parser.add_argument('threshold', type=float, default=0, help='Manual threshold value')
     parser.add_argument('--invert_output', default=False, action='store_true', help='Values below/above the threshold are labeled with 0/255 by default, and with 255/0 if this argument is used')
     args = parser.parse_args()
 
-    do_thresholding(args.im_in, args.im_out, args.th_method, args.block_size, args.threshold, args.invert_output)
+    do_thresholding(args.im_in, args.im_out, args.th_method, args.block_size, args.offset, args.threshold, args.invert_output)
--- a/auto_threshold.xml	Wed Mar 13 06:15:54 2024 +0000
+++ b/auto_threshold.xml	Thu Apr 04 15:23:18 2024 +0000
@@ -1,9 +1,17 @@
 <tool id="ip_threshold" name="Threshold image" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="20.05">
     <description>with scikit-image</description>
     <macros>
+        <import>creators.xml</import>
+        <import>tests.xml</import>
         <token name="@TOOL_VERSION@">0.18.1</token>
-        <token name="@VERSION_SUFFIX@">1</token>
+        <token name="@VERSION_SUFFIX@">2</token>
+        <xml name="inputs/offset">
+            <param name="offset" type="float" value="0" label="Offset" help="Offset to be added to the automatically determined threshold value. Positive values will increase the threshold (and thus reduce the amount of values above the threshold)." />
+        </xml>
     </macros>
+    <creator>
+        <expand macro="creators/bmcv"/>
+    </creator>
     <edam_operations>
         <edam_operation>operation_3443</edam_operation>
     </edam_operations>
@@ -12,7 +20,7 @@
         <xref type="biii">scikit-image</xref>
     </xrefs>
     <requirements> 
-        <requirement type="package" version="0.18.1">scikit-image</requirement>
+        <requirement type="package" version="@TOOL_VERSION@">scikit-image</requirement>
         <requirement type="package" version="2020.10.1">tifffile</requirement>
     </requirements>
     <command detect_errors="aggressive">
@@ -22,6 +30,7 @@
     ./out.tif
     '$th_method.method_id'
     '$th_method.block_size'
+    '$th_method.offset'
     '$th_method.threshold'
     $invert_output
     ]]>
@@ -42,34 +51,42 @@
             <when value="manual">
                 <param name="threshold" type="float" value="0" label="Threshold value" />
                 <param name="block_size" type="hidden" value="0" />
+                <param name="offset" type="hidden" value="0" />
             </when>
             <when value="otsu">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="hidden" value="0" />
+                <expand macro="inputs/offset" />
             </when>
             <when value="li">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="hidden" value="0" />
+                <expand macro="inputs/offset" />
             </when>
             <when value="isodata">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="hidden" value="0" />
+                <expand macro="inputs/offset" />
             </when>
             <when value="yen">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="hidden" value="0" />
+                <expand macro="inputs/offset" />
             </when>
             <when value="loc_gaussian">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="integer" value="5" label="Odd size of pixel neighborhood for determining the threshold" />
+                <expand macro="inputs/offset" />
             </when>
             <when value="loc_median">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="integer" value="5" label="Odd size of pixel neighborhood for determining the threshold" />
+                <expand macro="inputs/offset" />
             </when>
             <when value="loc_mean">
                 <param name="threshold" type="hidden" value="0" />
                 <param name="block_size" type="integer" value="5" label="Odd size of pixel neighborhood for determining the threshold" />
+                <expand macro="inputs/offset" />
             </when>
         </conditional>
         <param name="invert_output" type="boolean" checked="false" truevalue="--invert_output" falsevalue="" label="Invert output labels" help="Pixels are usually assigned the label 0 if the pixel value is below (or equal to) the threshold, and 255 if it is above the threshold. If this option is activated, pixels are assigned the label 255 if the pixel value is below (or equal to) the threshold, and 0 if it is above the threshold." />
@@ -78,36 +95,50 @@
        <data format="tiff" name="output" from_work_dir="out.tif" />
     </outputs>
     <tests>
+        <!-- Tests for single-channel images -->
         <test>
             <param name="input" value="sample.tif"/>
-            <output name="output" value="out.tif" ftype="tiff" compare="sim_size" delta="10"/>
             <param name="method_id" value="loc_gaussian"/>
-            <param name="block_size" value="3"/>
+            <param name="block_size" value="51"/>
             <param name="invert_output" value="False"/>
+            <expand macro="tests/binary_image_diff" name="output" value="out1.tif" ftype="tiff"/>
+        </test>
+        <test>
+            <param name="input" value="sample.tif"/>
+            <param name="method_id" value="loc_gaussian"/>
+            <param name="block_size" value="51"/>
+            <param name="offset" value="1"/>
+            <param name="invert_output" value="False"/>
+            <expand macro="tests/binary_image_diff" name="output" value="out2.tif" ftype="tiff"/>
         </test>
         <test>
             <param name="input" value="sample.tif"/>
-            <output name="output" value="out2.tif" ftype="tiff" compare="sim_size" delta="10"/>
             <param name="method_id" value="otsu"/>
-            <param name="block_size" value="5"/>
             <param name="invert_output" value="False"/>
+            <expand macro="tests/binary_image_diff" name="output" value="out3.tif" ftype="tiff"/>
         </test>
         <test>
             <param name="input" value="sample.tif"/>
-            <output name="output" value="out3.tif" ftype="tiff" compare="sim_size" delta="10"/>
             <param name="method_id" value="manual"/>
             <param name="threshold" value="64"/>
             <param name="invert_output" value="True"/>
+            <expand macro="tests/binary_image_diff" name="output" value="out4.tif" ftype="tiff"/>
+        </test>
+        <!-- Tests for multi-channel images -->
+        <test expect_failure="true">
+            <param name="input" value="rgb.png"/>
         </test>
     </tests>
     <help>
-        Applies a standard thresholding algorithm to an image.
+
+        **Applies a standard thresholding algorithm to a 2-D single-channel image. Yields a binary image.**
 
         The thresholding algorithm automatically determines a threshold value (unless manual thresholding is used).
         The input image is then thresholded, by assigning white (pixel value 255) to image regions above the determined threshold,
         and black (pixel value 0) to image regions below or equal to the determined threshold.
 
         The assignment of black and white to image regions below and above the threshold is inverted, if the corresponding option is set.
+
     </help>
     <citations>
         <citation type="doi">10.1016/j.jbiotec.2017.07.019</citation>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creators.xml	Thu Apr 04 15:23:18 2024 +0000
@@ -0,0 +1,23 @@
+<macros>
+
+    <xml name="creators/bmcv">
+        <organization name="Biomedical Computer Vision Group, Heidelberg Universtiy" alternateName="BMCV" url="http://www.bioquant.uni-heidelberg.de/research/groups/biomedical_computer_vision.html" />
+        <yield />
+    </xml>
+
+    <xml name="creators/alliecreason">
+        <person givenName="Allison" familyName="Creason"/>
+        <yield/>
+    </xml>
+
+    <xml name="creators/bugraoezdemir">
+        <person givenName="Bugra" familyName="Oezdemir"/>
+        <yield/>
+    </xml>
+
+    <xml name="creators/thawn">
+        <person givenName="Till" familyName="Korten"/>
+        <yield/>
+    </xml>
+    
+</macros>
Binary file test-data/out.tif has changed
Binary file test-data/out1.tif has changed
Binary file test-data/out2.tif has changed
Binary file test-data/out3.tif has changed
Binary file test-data/out4.tif has changed
Binary file test-data/rgb.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests.xml	Thu Apr 04 15:23:18 2024 +0000
@@ -0,0 +1,95 @@
+<macros>
+
+    <!-- Macros for verification of image outputs -->
+
+    <xml
+        name="tests/binary_image_diff"
+        tokens="name,value,ftype,metric,eps"
+        token_metric="mae"
+        token_eps="0.01">
+
+        <output name="@NAME@" value="@VALUE@" ftype="@FTYPE@" compare="image_diff" metric="@METRIC@" eps="@EPS@" pin_labels="0">
+            <assert_contents>
+                <has_image_n_labels n="2"/>
+                <yield/>
+            </assert_contents>
+        </output>
+
+    </xml>
+
+    <xml
+        name="tests/label_image_diff"
+        tokens="name,value,ftype,metric,eps,pin_labels"
+        token_metric="iou"
+        token_eps="0.01"
+        token_pin_labels="0">
+
+        <output name="@NAME@" value="@VALUE@" ftype="@FTYPE@" compare="image_diff" metric="@METRIC@" eps="@EPS@" pin_labels="@PIN_LABELS@">
+            <assert_contents>
+                <yield/>
+            </assert_contents>
+        </output>
+
+    </xml>
+
+    <xml
+        name="tests/intensity_image_diff"
+        tokens="name,value,ftype,metric,eps"
+        token_metric="rms"
+        token_eps="0.01">
+
+        <output name="@NAME@" value="@VALUE@" ftype="@FTYPE@" compare="image_diff" metric="@METRIC@" eps="@EPS@">
+            <assert_contents>
+                <yield/>
+            </assert_contents>
+        </output>
+
+    </xml>
+
+    <!-- Variants of the above for verification of collection elements -->
+
+    <xml
+        name="tests/binary_image_diff/element"
+        tokens="name,value,ftype,metric,eps"
+        token_metric="mae"
+        token_eps="0.01">
+
+        <element name="@NAME@" value="@VALUE@" ftype="@FTYPE@" compare="image_diff" metric="@METRIC@" eps="@EPS@" pin_labels="0">
+            <assert_contents>
+                <has_image_n_labels n="2"/>
+                <yield/>
+            </assert_contents>
+        </element>
+
+    </xml>
+
+    <xml
+        name="tests/label_image_diff/element"
+        tokens="name,value,ftype,metric,eps"
+        token_metric="iou"
+        token_eps="0.01"
+        token_pin_labels="0">
+
+        <element name="@NAME@" value="@VALUE@" ftype="@FTYPE@" compare="image_diff" metric="@METRIC@" eps="@EPS@" pin_labels="@PIN_LABELS@">
+            <assert_contents>
+                <yield/>
+            </assert_contents>
+        </element>
+
+    </xml>
+
+    <xml
+        name="tests/intensity_image_diff/element"
+        tokens="name,value,ftype,metric,eps"
+        token_metric="rms"
+        token_eps="0.01">
+
+        <element name="@NAME@" value="@VALUE@" ftype="@FTYPE@" compare="image_diff" metric="@METRIC@" eps="@EPS@">
+            <assert_contents>
+                <yield/>
+            </assert_contents>
+        </element>
+
+    </xml>
+
+</macros>