{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Open Op" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Added new repo: scijava.public\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "method": "display_data" }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8500594d-d570-4436-8810-ac4ea971c8ac", "version_major": 2, "version_minor": 0 }, "method": "display_data" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "net.imagej.ImageJ@3baf5137" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "//load ImageJ\n", "%classpath config resolver scijava.public https://maven.scijava.org/content/groups/public\n", "%classpath add mvn net.imagej imagej 2.0.0-rc-67\n", "\n", "//create ImageJ object\n", "ij = new net.imagej.ImageJ()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This op performs [morphological opening](https://en.wikipedia.org/wiki/Opening_(morphology)) on any binary image. Let's see how the `Op` is called:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Available operations:\n", "\t(IterableInterval out?) =\n", "\tnet.imagej.ops.morphology.open.ListOpen(\n", "\t\tIterableInterval out?,\n", "\t\tRandomAccessibleInterval in1,\n", "\t\tList in2)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ij.op().help(\"open\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the parameters here:\n", "\n", "* `IterableInterval out`: the output image\n", "* `RandomAccessibleInterval in1`: the input image\n", "* `List in2`: this parameter contains all of the [`Shape`](http://javadoc.scijava.org/ImgLib2/net/imglib2/algorithm/neighborhood/Shape.html)s that the `Op` will use to open (i.e. for each `Shape` in `in2` open the input (or output of the last `open` if there are 2+ `Shape`s in `in2`)).\n", "\n", "We need to get a binary image to perform any morphological operations. Let's get a grayscale image and then binarize it using [the Huang Threshold Op](../threshold/threshold.ipynb#Huang-Thresholding):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[INFO] Verifying GIF format\n", "[INFO] Reading dimensions\n", "[INFO] Reading data blocks\n" ] }, { "data": { "image/png": "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" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input_full = ij.scifio().datasetIO().open(\"http://imagej.net/images/blobs.gif\")\n", "\n", "//input_full has 3 channels. We only need one.\n", "input = ij.op().run(\"hyperSliceView\", input_full, 2, 0)\n", "\n", "//invert the image so that the blobs are \"on\" and the background \"off\"\n", "inverted = ij.op().run(\"create.img\", input)\n", "ij.op().run(\"invert\", inverted, input)\n", "\n", "binaryInput = ij.op().run(\"threshold.huang\", inverted)\n", "\n", "ij.notebook().display(binaryInput)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As it states in the Wikipedia article, opening is able to remove any object smaller than our `Shape`, while (as best it can) leaving objects larger than that element the same. Let's open our image with a somewhat large `Shape` to remove the smallest blobs in the image:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.algorithm.neighborhood.HyperSphereShape\n", "\n", "//create the shape that we are going to dilate the image with\n", "shape = new HyperSphereShape(6)\n", "\n", "output = ij.op().run(\"open\", null, binaryInput, [shape])\n", "\n", "ij.notebook().display(output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To show the difference, let's [stack](../transform/stackView.ipynb) the images to see the difference:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.img.Img\n", "\n", "list = new ArrayList()\n", " \n", "list.add(binaryInput)\n", "list.add(output)\n", "\n", "stacked = ij.op().run(\"stackView\", list)\n", "\n", "ij.notebook().display(stacked)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the yellow regions where the largest blobs remained (mostly) intact from the original in red to the output of the `Op` in green. Note the more [eccentric](https://en.wikipedia.org/wiki/Eccentricity_(mathematics)) the object the poorer it was restored (due to our `Shape` being a `HyperSphere`). However the smallest objects (shown in red) are removed from the image." ] } ], "metadata": { "kernelspec": { "display_name": "Groovy", "language": "groovy", "name": "groovy" }, "language_info": { "codemirror_mode": "groovy", "file_extension": ".groovy", "mimetype": "", "name": "Groovy", "nbconverter_exporter": "", "version": "2.4.3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": false, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": false, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }