{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## ExtractHoles 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": "0433a9e1-d03a-4c25-afed-8d0201d9f5d9", "version_major": 2, "version_minor": 0 }, "method": "display_data" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "net.imagej.ImageJ@7b00c550" ] }, "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` fills in any holes (defined as a group of \"off\" pixels surrounded \"on\" pixels on all sides) in a binary image. The `Op` is called as follows:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Available operations:\n", "\t(RandomAccessibleInterval out) =\n", "\tnet.imagej.ops.morphology.extractHoles.DefaultExtractHolesComputer(\n", "\t\tRandomAccessibleInterval out,\n", "\t\tRandomAccessibleInterval in,\n", "\t\tShape structElement?)\n", "\t(RandomAccessibleInterval out) =\n", "\tnet.imagej.ops.morphology.extractHoles.DefaultExtractHolesFunction(\n", "\t\tRandomAccessibleInterval in,\n", "\t\tShape structElement?)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ij.op().help(\"extractHoles\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the parameters here:\n", "\n", "* `RandomAccessibleInterval out`: the **(optional)** output image. If an output is given `DefaultExtractHolesComputer` is run, and `DefaultExtractHolesFunction` is run with no preallocated output.\n", "* `RandomAccessibleInterval in1`: the input image\n", "* `Shape structElement`: an **optional** parameter that defines how large of a space the `Op` searches when filling the holes. When the `Op` finds an \"off\" value that it determines is not an edge it will attempt to fill that \"off\" pixel and any neighboring values (where the `Neighborhood` is defined by this `Shape`) that are also \"off\" and not separated from the current value by an \"on\" pixel. Most of the time no value needs to be passed through, so thus we leave this parameter out of the notebook. \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", " binaryInput = ij.op().run(\"threshold.huang\", input)\n", "\n", "ij.notebook().display(binaryInput)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have our image, let's fill in all of these holes. Note that the blobs that are on the edges of the image aren't really \"holes\" (since they are not surrounded by \"on\" pixels on all sides\", thus they will not be filled in:" ] }, { "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.RectangleShape\n", "\n", "output = ij.op().run(\"extractHoles\", binaryInput)\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", "//red in stacked image\n", "list.add(binaryInput)\n", "//green in stacked image\n", "list.add(output)\n", "\n", "stacked = ij.op().run(\"stackView\", list)\n", "\n", "ij.notebook().display(stacked)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that all of the non-edge blobs being green in the stacked image, where `extractHoles` found all of the \"off\" values in the original and returned all of them \"on\" (hence the green color)." ] } ], "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 }