Python Extensions

Description

KNIME Image Processing Python Bindings to work with images in the KNIME Python Extension.

Installation Instructions

You can install the KNIME Python Bindings from the stable community contributions update-site (see /wiki/install-knime-image-processing 2.2 how to activate it).

Python Requirements

In order to use the Python Bindings, you have to install the KNIME Python Integration, which can be found on the default KNIME Update-Site. In addition to that, your local Python installation must comprise the following packages:

  • Python 2.7, NumPy, Pandas 0.7, Protobuf 2.5, JEDI

See also: /blog/how-to-setup-the-python-extension

Example

An example workflow can be downloaded

.

In order to access the image data from e.g. an "Image Reader" node, a "Python Script" node must contain the following lines:

  	from KNIPImage import KNIPImage      from scipy import ndimage         # Copy structure of incoming KNIME table      output_table = input_table.copy()         # Create empty output_column      output_column = []         # Loop over every cell in the 'Img' column      for index,input_cell in input_table['Img'].iteritems():            # get image from cell         image = input_cell.array            # apply some operation of image, here a Gaussian filtering         filtered = ndimage.gaussian_filter(image, 3)            # Write result back into a KNIPImage         output_cell = KNIPImage(filtered)            # Append output_cell to output array         output_column.append(output_cell)        # Set output_column in output_table     output_table['Img'] = output_column  

Details:

  • In the above script, `input_cell` and `output_cell` are instances of KNIPImage. Further information/metadata could be defined in this class.
  • Copying `output_table` from `input_table` will keep the table structure that KNIME expects intact. Since we are only interested in manipulating the `"Img"` column, we can do so without having to worry about creating a new table.
  • In the above copy operation, arrays are not copied. This is good, because (a) we save memory and (b) we loaded the image from a   byte-stream and could not possibly change anything in the previous node.
  • Keep in mind that instead of creating an output_column and setting it as the Img column of the output_table,   we can just edit the  input_cell.array in-place with  e.g. input_cell.array[0,:,:] = 1. This hackish approach saves memory and reduces the amount of scripting code.

Notes

KNIME is written in Java while NumPy is a CPython extension.

See also:

We use a patched version of tifffile.py by Christoph Goehlke to byte-stream images from and to Python. This results in an increased memory footprint and additional processing time. See our GitHub repository https://github.com/knime-ip/knip-python-bindings for details.

Contact

Christian Dietz: christian.dietz@uni-konstanz.de
Paul Mueller (BioTec TU Dresden): paul.mueller@biotec.tu-dresden.de
Laurent Abouchar (MPICBG Dresden): abouchar@mpi-cbg.de