{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## FillHoles 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": "ac759148-a7b9-4f9d-8aac-b7463e4429b9", "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.fillHoles.DefaultFillHoles(\n", "\t\tRandomAccessibleInterval out?,\n", "\t\tRandomAccessibleInterval in,\n", "\t\tShape structElement?)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ij.op().help(\"fillHoles\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the parameters here:\n", "\n", "* `RandomAccessibleInterval out`: the **(optional)** output image.\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": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAD+CAYAAADVndu7AAAE3UlEQVR42u3d0XLaQBBFQf3/TydPdkFisATSMjO3u4q3WJFWO6cwxnj7c6Jt295+VDmPK85r9TmvOvezz5+F6z9t+DsG4Mrh7xgvFq5/lU2QvCmvDkC386dZACrecAFYc/6dv22JH/4KAUj/nnTF8AuAAFwWgITBEoC5L15GD/+7AUh4Zbrzq/8CIACXBaDLjU368ZkACMCSAHS6sdXP0U8ABOCj6z49AEfPt+2NFAABWBGArje163mlBgABcCP9GJCr13zaq+oC4J2A9owAGH4BsG/ODIAbKwAC4BmAGysAAiAAbqwAXHMtLN47AiAAVa6FwQHgcxHocC0IgBsZGgA+um82wz84AtWvhQIB2HMjBEAAzr4eSuyb/TdDAPpFoOI1ERQAPhcB7BcBCI0A9suhAFz1OgDrbyr2yyUBOPqfsf6mYq8c2SfbK5vHRqx3g7FHXtkn26ubyGaEHhH45WteH1yDD+2jYXhBAIDMAAACAKQFwBKAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAABfg71tPz4EAAIH/1EEBACGD/yzCAgAhA3/3cMyQujwCwAED78AQPDwCwAED78AgAAAAgAIACAAgAAAAgBMCsD3MS0r5EVAACA0AHfHs6SQE4H/jmU5IScCDwNw9AuBXhF4cIz3DgDUD8OTf/t+RYC2sTjnewlAAICEAAgBCIAVhOQAiAAIACAAgAAAAgAEBEAEQACAHkN/+xAACBz8cwMgAtBu+AUAgodfACB4+AUAgodfACB4+AUABEAAIHH4vQ8ABEAAQAAEAATA8IMAGH4IiIDhBwEw/CAABh+CArD3HwMDI7DnC4ChEbBEEBwDywLBUbAEIACAAAACAAgAIACAAAACAPQd+H/e2SsAEDT83gkIhl8AQAAEACID4DUA4HkAfB4ABAbAB4NAaAB8NBiEBsCHg0JoAHw0OIQGwB8HgdAA+NNgIAACAAIgADB42P11YDD4AgCGXwAgevgFAIKHXwAgePjfCwDQevgFAATA8EPi8L8WAGDE8B//ZSBgyPDffiio4Yew4T8SAGDQ4PtYcAgffgGA4OEXAAgefgEAAQASh18AQACAxOEXABAAQAAAAQDGR+D7uJYWsgJwd1xLCxkB+PG4lhbmB+DhcS0tzI7A02NaVpgbgV+PZ0lhXgh2H8dSQnBILAEIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgCcOPhff0XIUoAAAGnDLwAgAEDi8AsABA+/AIAAAAIARA2/AIBnAIAAAAIACAAgAMDkCFgSCI6A5YDgCFgKCA6BJQABAAQACHstQAMgOgC3DyA4ACIA4QEQAQgPgAhAeABEAAQASA2ACIAAAAIAxAVABEAAAAEA4gIgAiAAgAAAAgBkBAAQACAtAIAAAGkBAEIDAIQGAAgMABAWACA0AJYABAAQAEAAAAEABAAQAEAAAAEABADqbGZvaRcA9g1I918DT/osyyuvRwA+sOiVh6X6AE24hrOuVQCKbLCpg1/tGieFrMqzGwE4aYNNHfwq1zcpZJWe4QjAiRts6vBXuL5pz2aqPMP5C6XnDpkNZKAZAAAAAElFTkSuQmCC" }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.algorithm.neighborhood.RectangleShape\n", "\n", "output = ij.op().run(\"fillHoles\", null, 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", "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 no blobs are found, as well as the green regions, where the holes (\"off\" in the red image) are now filled in (\"on\" in the green 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 }