{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Entfernen von Beschriftungen an Bildr\u00e4ndern\n", "Bei der wissenschaftlichen Bildanalyse ist es oft relevant, dass nur vollst\u00e4ndig erfasste Objekte im Bild analysiert werden." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [] }, "outputs": [], "source": [ "import pyclesperanto_prototype as cle\n", "from skimage.segmentation import clear_border, relabel_sequential\n", "from skimage.io import imread\n", "import stackview\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unser Ausgangspunkt soll ein Beschriftungsbild sein; zum Beispiel abgeleitet von blobs.tif durch Schwellenwertbildung und Kennzeichnung zusammenh\u00e4ngender Komponenten:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\structure\\code\\pyclesperanto_prototype\\pyclesperanto_prototype\\_tier9\\_imshow.py:34: UserWarning: cle.imshow is deprecated, use stackview.imshow instead.\n", " warnings.warn(\"cle.imshow is deprecated, use stackview.imshow instead.\")\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max62.0
\n", "\n", "
" ], "text/plain": [ "cl.OCLArray([[ 0, 0, 0, ..., 59, 59, 59],\n", " [ 0, 0, 0, ..., 59, 59, 59],\n", " [ 0, 0, 0, ..., 59, 59, 59],\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": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# load data\n", "image = imread('../../data/blobs.tif')\n", "\n", "# process the image\n", "blurred = cle.gaussian_blur(image, sigma_x=1, sigma_y=1)\n", "binary = cle.threshold_otsu(blurred)\n", "labeled = cle.connected_components_labeling_box(binary)\n", "\n", "# show result\n", "labeled" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of objects in the image: 62\n" ] } ], "source": [ "num_labels = len(np.unique(labeled)) - 1\n", "print(\"Anzahl der Objekte im Bild: \" + str(num_labels))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Falls die Gr\u00f6\u00dfe der Objekte relevant ist, sollte man die Objekte ausschlie\u00dfen, die nicht vollst\u00e4ndig abgebildet wurden und somit den Bildrand ber\u00fchren." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max55
\n", "\n", "
" ], "text/plain": [ "StackViewNDArray([[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_excl_edges = clear_border(np.asarray(labeled))\n", "\n", "stackview.insight(labels_excl_edges)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Beachten Sie, dass die maximale Intensit\u00e4t im obigen Beschriftungsbild 55 betr\u00e4gt und die Anzahl der Objekte 44 ist (siehe unten). Dies ist also ein Beschriftungsbild, in dem nicht alle Beschriftungen zwischen 1 und 44 vorhanden sind." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of objects in the image: 44\n" ] } ], "source": [ "num_labels = len(np.unique(labels_excl_edges)) - 1\n", "print(\"Anzahl der Objekte im Bild: \" + str(num_labels))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Anschlie\u00dfende Beschriftung\n", "Viele Algorithmen zur weiteren Verarbeitung von Beschriftungsbildern erfordern, dass die Beschriftungen fortlaufend nummeriert sind. Daher m\u00fcssen wir dies bei dem obigen Bild korrigieren." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max44
\n", "\n", "
" ], "text/plain": [ "StackViewNDArray([[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": [ "relabeled, _, _ = relabel_sequential(labels_excl_edges)\n", "\n", "stackview.insight(relabeled)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Andere Implementierungen zum Entfernen von Objekten an Bildr\u00e4ndern erfordern diesen Schritt nicht:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "cle._ image
\n", "\n", "\n", "\n", "\n", "\n", "
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max44.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": [ "# Exclude Labels On Edges\n", "labels_excl_edges = cle.exclude_labels_on_edges(labeled)\n", "\n", "labels_excl_edges" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of objects in the image: 44\n" ] } ], "source": [ "num_labels = len(np.unique(labels_excl_edges)) - 1\n", "print(\"Anzahl der Objekte im Bild: \" + str(num_labels))" ] }, { "cell_type": "code", "execution_count": null, "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.19" } }, "nbformat": 4, "nbformat_minor": 4 }