{
"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",
"cle._ image \n",
"\n",
"shape | (256, 256) | \n",
"dtype | float32 | \n",
"size | 256.0 kB | \n",
"min | 1091.0 | max | 58327.0 | \n",
" \n",
" \n",
" | \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",
"cle._ image \n",
"\n",
"shape | (256, 256) | \n",
"dtype | uint32 | \n",
"size | 256.0 kB | \n",
"min | 0.0 | max | 17.0 | \n",
" \n",
"\n",
" | \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",
"cle._ image \n",
"\n",
"shape | (256, 256) | \n",
"dtype | uint32 | \n",
"size | 256.0 kB | \n",
"min | 0.0 | max | 16.0 | \n",
" \n",
"\n",
" | \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",
"cle._ image \n",
"\n",
"shape | (256, 256) | \n",
"dtype | uint32 | \n",
"size | 256.0 kB | \n",
"min | 0.0 | max | 3.0 | \n",
" \n",
"\n",
" | \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",
"cle._ image \n",
"\n",
"shape | (256, 256) | \n",
"dtype | uint32 | \n",
"size | 256.0 kB | \n",
"min | 0.0 | max | 37.0 | \n",
" \n",
"\n",
" | \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",
"cle._ image \n",
"\n",
"shape | (256, 256) | \n",
"dtype | uint32 | \n",
"size | 256.0 kB | \n",
"min | 0.0 | max | 11.0 | \n",
" \n",
"\n",
" | \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
}