{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## FlatIterableView 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": "961533fc-65e5-454d-9449-3b9126f8f83c", "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` wraps the `Views.flatIterable()` method of ImgLib2, taking any `RandomAccessibleInterval` and providing an `IterableInterval` output that iterates with a [`FlatIterationOrder`](http://javadoc.scijava.org/ImgLib2/net/imglib2/FlatIterationOrder.html) (where an increment in the cursor increases the position in the first dimension by 1, then, when the cursor is at the last position in a particular dimension, the cursor resets the position in the first dimension to 0 and increments the position in the second dimension). This can be particularily useful if it is of vital importance that you iterate an image in this method, as there are some types of images (for example, [`CellImg`](http://javadoc.scijava.org/ImgLib2/net/imglib2/img/cell/CellImg.html)) that do not iterate in this order." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Available operations:\n", "\t(IterableInterval out) =\n", "\tnet.imagej.ops.transform.flatIterableView.DefaultFlatIterableView(\n", "\t\tRandomAccessibleInterval in)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ij.op().help('flatIterableView')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a `CellImg` and iterate over it, to show that this iteration order is not flat. We will assign a unique, increasing value to each pixel to show the order:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.type.numeric.real.FloatType\n", "import net.imglib2.img.cell.CellImgFactory\n", "import net.imglib2.interpolation.randomaccess.NearestNeighborInterpolatorFactory\n", "\n", "//note that the factory is constructed with the type of the image and then the size of the cells within the image.\n", "//This has nothing to do with the size of the image itself.\n", "imgFactory = new CellImgFactory(new FloatType(), 80, 80)\n", "\n", "//here we create the image (with the numbers denoting the image size)\n", "cellImg = imgFactory.create(100, 100)\n", "\n", "cursor = cellImg.cursor()\n", "\n", "value = 1\n", "\n", "while(cursor.hasNext()){\n", " cursor.next().set(value++)\n", "}\n", "\n", "ij.notebook().display(cellImg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, there is in fact a ramp within each of the cells, however the `Cursor` did **not** iterate in a flat iteration order. Let's transform this `CellImg` using `flatIterable` and create a ramp across the whole 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": [ "flat = ij.op().run(\"flatIterableView\", cellImg)\n", "\n", "flatIterableCursor = flat.cursor()\n", "\n", "value = 1\n", "\n", "while(flatIterableCursor.hasNext()){\n", " flatIterableCursor.next().set(value++)\n", "}\n", "\n", "ij.notebook().display(flat)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that `flatIterable` is one of the transform `Op`s, and all such `Op`s return a [`View`](http://javadoc.scijava.org/ImgLib2/net/imglib2/view/Views.html). This `View` actually updates the underlying image (i.e. `cellImg`), and as such if we look at `cellImg` it is exactly the same as `flat`, a reason as to why `flatIterable` can be very useful:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ij.notebook().display(cellImg)" ] } ], "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 }