{ "cells": [ { "cell_type": "markdown", "id": "925cb362-2b6f-4375-9e18-22ae9c224f4b", "metadata": {}, "source": [ "# Erodierte Otsu-Kennzeichnung\n", "Diese Operation segmentiert und kennzeichnet ein Bild unter Verwendung von Unsch\u00e4rfe, Otsu-Schwellenwertbildung, bin\u00e4rer Erosion und maskierter Voronoi-Kennzeichnung.\n", "\n", "Nach der Unsch\u00e4rfe und Schwellenwertbildung mit Otsus Methode wird eine iterative bin\u00e4re Erosion angewendet. Objekte im erodierten Bild werden mittels Zusammenhangskomponenten-Kennzeichnung markiert und diese Kennzeichnungen werden wieder auf die urspr\u00fcngliche Gr\u00f6\u00dfe im Ausgangsbin\u00e4rbild erweitert, indem eine maskierte Voronoi-Kennzeichnung verwendet wird.\n", "\n", "Diese Funktion \u00e4hnelt `voronoi_otsu_labeling`. Sie soll besser mit F\u00e4llen umgehen k\u00f6nnen, in denen sich die Kennzeichnungen von Objekten \u00fcberschneiden, wenn die Objekte dicht beieinander liegen. Wie bei der Voronoi-Otsu-Kennzeichnung k\u00f6nnen kleine Objekte bei der Anwendung dieser Operation verschwinden.\n", "\n", "Diese Funktion ist inspiriert von einer \u00e4hnlichen [Implementierung in Java](https://github.com/biovoxxel/bv3dbox/blob/9e38ed02cff606e7e8fbe57db0f6af810bf1a83a/BioVoxxel_3D_Box/src/main/java/de/biovoxxel/bv3dbox/plugins/BV_LabelSplitter.java#L83) von Jan Brocher (Biovoxxel) in der [Biovoxxel Toolbox](https://zenodo.org/badge/latestdoi/434949702). Vielen Dank, Jan!" ] }, { "cell_type": "code", "execution_count": 1, "id": "8d145bbd-da76-4b81-9355-82db031c1dfe", "metadata": {}, "outputs": [], "source": [ "from skimage.data import cells3d\n", "import pyclesperanto_prototype as cle\n", "import napari_segment_blobs_and_things_with_membranes as nsbatwm" ] }, { "cell_type": "code", "execution_count": 2, "id": "eb4a2ea5-a362-426d-807a-f7bbb375fd4e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(60, 2, 256, 256)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "image = cells3d()\n", "image.shape" ] }, { "cell_type": "markdown", "id": "380e59ab-2a3e-4650-a866-c5d13315ad71", "metadata": {}, "source": [ "Wir schneiden einfach eine 2D-Scheibe heraus." ] }, { "cell_type": "code", "execution_count": 3, "id": "997d3d15-f380-436d-b819-60f6b1ed8672", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(256, 256)
dtypefloat32
size256.0 kB
min1091.0
max58327.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[ 8868., 6923., 5690., ..., 13942., 12804., 14653.],\n", " [ 7113., 5501., 5216., ..., 16739., 13657., 15554.],\n", " [ 5833., 7160., 5928., ..., 15838., 16739., 17166.],\n", " ...,\n", " [ 2513., 3936., 3414., ..., 3699., 4126., 4220.],\n", " [ 3319., 3272., 2513., ..., 3699., 3367., 2940.],\n", " [ 3130., 3794., 3225., ..., 2987., 3746., 4315.]],\n", " dtype=float32)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nuclei = cle.asarray(image[30, 1])\n", "nuclei" ] }, { "cell_type": "code", "execution_count": 4, "id": "598aa36f-a3cd-443f-8165-2d88d7b0e0ba", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(256, 256)
dtypeuint32
size256.0 kB
min0.0
max17.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=uint32)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = cle.eroded_otsu_labeling(nuclei, number_of_erosions=11, outline_sigma=4)\n", "labels" ] }, { "cell_type": "markdown", "id": "f2e9b308-7955-49ba-9887-ad83fac8e505", "metadata": {}, "source": [ "## Parameter: number_of_erosions\n", "Wenn die angegebene Anzahl der Erosionen zu gering ist, werden zusammenh\u00e4ngende Objekte gemeinsam gekennzeichnet." ] }, { "cell_type": "code", "execution_count": 5, "id": "69e13d04-152f-4ee5-8dd5-4d8db331c4f9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(256, 256)
dtypeuint32
size256.0 kB
min0.0
max16.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=uint32)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = cle.eroded_otsu_labeling(nuclei, number_of_erosions=5, outline_sigma=4)\n", "labels" ] }, { "cell_type": "markdown", "id": "607ac2f1-b594-4f82-98dc-27e305d8fe96", "metadata": {}, "source": [ "Wenn zu viele Erosionen konfiguriert sind, k\u00f6nnen Objekte verschwinden." ] }, { "cell_type": "code", "execution_count": 6, "id": "62b486af-235e-42be-9785-9009ff3df68a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(256, 256)
dtypeuint32
size256.0 kB
min0.0
max3.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=uint32)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = cle.eroded_otsu_labeling(nuclei, number_of_erosions=20, outline_sigma=4)\n", "labels" ] }, { "cell_type": "markdown", "id": "83b2ece5-b769-4e42-858f-dc26ec06cfc0", "metadata": {}, "source": [ "## Parameter: outline_sigma\n", "Mit diesem Umriss k\u00f6nnen Sie die Rauschunterdr\u00fcckung vor der Schwellenwertbildung steuern. Wenn dieser Wert zu niedrig ist, k\u00f6nnen Objekte verrauschte Kanten haben und L\u00f6cher f\u00fchren zu mehr Objekttrennungen." ] }, { "cell_type": "code", "execution_count": 7, "id": "f3f28d92-1f8c-4a86-adb5-d0eb9fbc4eb7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(256, 256)
dtypeuint32
size256.0 kB
min0.0
max37.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=uint32)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = cle.eroded_otsu_labeling(nuclei, number_of_erosions=5, outline_sigma=1)\n", "labels" ] }, { "cell_type": "markdown", "id": "a20547ce-b34d-4417-bc93-5ff4f0d4c763", "metadata": {}, "source": [ "Wenn dieser Wert zu hoch ist, passen die Objektumrisse m\u00f6glicherweise nicht mehr zu den urspr\u00fcnglichen Objekten." ] }, { "cell_type": "code", "execution_count": 8, "id": "ab4de1df-5371-4f43-a699-39123c1ce007", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(256, 256)
dtypeuint32
size256.0 kB
min0.0
max11.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=uint32)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = cle.eroded_otsu_labeling(nuclei, number_of_erosions=11, outline_sigma=10)\n", "labels" ] }, { "cell_type": "code", "execution_count": null, "id": "bad3d788-baf1-482a-a818-3596ecd49e08", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.15" } }, "nbformat": 4, "nbformat_minor": 5 }