From cc46a629b38b213916fe76083134e098476b4f4b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 11:31:47 +0000 Subject: [PATCH 1/4] Downloaded https://github.com/user-attachments/assets/da6456bb-7bdf-4ad8-8f0d-95e38fa110e9, saved as human_mitosis_small.png. --- human_mitosis_small.png | Bin 0 -> 28933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 human_mitosis_small.png diff --git a/human_mitosis_small.png b/human_mitosis_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9488e3d113239865181fee2dc7236147048a2a23 GIT binary patch literal 28933 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 Date: Sun, 13 Oct 2024 11:32:11 +0000 Subject: [PATCH 2/4] Created a Jupyter notebook for nuclei segmentation using Voronoi-Otsu-Labeling and saved the result as an RGB PNG. --- nuclei_segmentation.ipynb | 175 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 nuclei_segmentation.ipynb diff --git a/nuclei_segmentation.ipynb b/nuclei_segmentation.ipynb new file mode 100644 index 0000000..c80b138 --- /dev/null +++ b/nuclei_segmentation.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nuclei Segmentation using Voronoi-Otsu-Labeling\n", + "\n", + "This notebook demonstrates how to segment nuclei in an image using Voronoi-Otsu-Labeling." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-13T11:32:07.343272Z", + "iopub.status.busy": "2024-10-13T11:32:07.343095Z", + "iopub.status.idle": "2024-10-13T11:32:08.667576Z", + "shell.execute_reply": "2024-10-13T11:32:08.666917Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/napari_tools_menu/__init__.py:10: UserWarning: Importing QT failed; now introducing dummy definitions of QMenu class and register_function decorator.\n", + " warnings.warn(\"Importing QT failed; now introducing dummy definitions of QMenu class and register_function decorator.\")\n" + ] + } + ], + "source": [ + "import napari_segment_blobs_and_things_with_membranes as nsbatwm\n", + "from skimage.io import imread, imsave\n", + "import stackview\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the image" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-13T11:32:08.703546Z", + "iopub.status.busy": "2024-10-13T11:32:08.702936Z", + "iopub.status.idle": "2024-10-13T11:32:08.712596Z", + "shell.execute_reply": "2024-10-13T11:32:08.712093Z" + } + }, + "outputs": [], + "source": [ + "image = imread('human_mitosis_small.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Segment nuclei using Voronoi-Otsu-Labeling" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-13T11:32:08.714401Z", + "iopub.status.busy": "2024-10-13T11:32:08.714218Z", + "iopub.status.idle": "2024-10-13T11:32:10.126286Z", + "shell.execute_reply": "2024-10-13T11:32:10.125725Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/napari_segment_blobs_and_things_with_membranes/__init__.py:564: UserWarning: threshold_otsu is expected to work correctly only for grayscale images; image shape (180, 247, 4) looks like that of an RGB image.\n", + " threshold = sk_threshold_otsu(blurred_outline)\n" + ] + } + ], + "source": [ + "labels = nsbatwm.voronoi_otsu_labeling(image, spot_sigma=3.5, outline_sigma=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize the results" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-13T11:32:10.130002Z", + "iopub.status.busy": "2024-10-13T11:32:10.128027Z", + "iopub.status.idle": "2024-10-13T11:32:10.473470Z", + "shell.execute_reply": "2024-10-13T11:32:10.472662Z" + } + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "index 192 is out of bounds for axis 0 with size 180", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mstackview\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43manimate_curtain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimage\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43msegmentation_result.gif\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/stackview/_animate.py:140\u001b[0m, in \u001b[0;36manimate_curtain\u001b[0;34m(timelapse, timelapse_curtain, axis, alpha, num_steps, zoom_factor, colormap, display_min, display_max, curtain_colormap, curtain_display_min, curtain_display_max, filename, overwrite_file, frame_delay_ms, num_loops)\u001b[0m\n\u001b[1;32m 137\u001b[0m image_slice_curtain \u001b[38;5;241m=\u001b[39m _img_to_rgb(timelapse_curtain, colormap\u001b[38;5;241m=\u001b[39mcurtain_colormap, display_min\u001b[38;5;241m=\u001b[39mcurtain_display_min,\n\u001b[1;32m 138\u001b[0m display_max\u001b[38;5;241m=\u001b[39mcurtain_display_max)\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 140\u001b[0m image_slice \u001b[38;5;241m=\u001b[39m _img_to_rgb(\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtake\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimelapse\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mslider_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m)\u001b[49m, colormap\u001b[38;5;241m=\u001b[39mcolormap,\n\u001b[1;32m 141\u001b[0m display_min\u001b[38;5;241m=\u001b[39mdisplay_min, display_max\u001b[38;5;241m=\u001b[39mdisplay_max)\n\u001b[1;32m 142\u001b[0m image_slice_curtain \u001b[38;5;241m=\u001b[39m _img_to_rgb(np\u001b[38;5;241m.\u001b[39mtake(timelapse_curtain, slider_value, axis\u001b[38;5;241m=\u001b[39maxis),\n\u001b[1;32m 143\u001b[0m colormap\u001b[38;5;241m=\u001b[39mcurtain_colormap, display_min\u001b[38;5;241m=\u001b[39mcurtain_display_min,\n\u001b[1;32m 144\u001b[0m display_max\u001b[38;5;241m=\u001b[39mcurtain_display_max)\n\u001b[1;32m 145\u001b[0m image_slice[:, slider_value:] \u001b[38;5;241m=\u001b[39m (\u001b[38;5;241m1\u001b[39m \u001b[38;5;241m-\u001b[39m alpha) \u001b[38;5;241m*\u001b[39m image_slice[:, slider_value:] \u001b[38;5;241m+\u001b[39m \\\n\u001b[1;32m 146\u001b[0m alpha \u001b[38;5;241m*\u001b[39m image_slice_curtain[:, slider_value:]\n", + "File \u001b[0;32m/opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/numpy/_core/fromnumeric.py:207\u001b[0m, in \u001b[0;36mtake\u001b[0;34m(a, indices, axis, out, mode)\u001b[0m\n\u001b[1;32m 109\u001b[0m \u001b[38;5;129m@array_function_dispatch\u001b[39m(_take_dispatcher)\n\u001b[1;32m 110\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtake\u001b[39m(a, indices, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, out\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mraise\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m 111\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;124;03m Take elements from an array along an axis.\u001b[39;00m\n\u001b[1;32m 113\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[38;5;124;03m [5, 7]])\u001b[39;00m\n\u001b[1;32m 206\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 207\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_wrapfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtake\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindices\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/numpy/_core/fromnumeric.py:57\u001b[0m, in \u001b[0;36m_wrapfunc\u001b[0;34m(obj, method, *args, **kwds)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _wrapit(obj, method, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 57\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbound\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 59\u001b[0m \u001b[38;5;66;03m# A TypeError occurs if the object does have such a method in its\u001b[39;00m\n\u001b[1;32m 60\u001b[0m \u001b[38;5;66;03m# class, but its signature is not identical to that of NumPy's. This\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[38;5;66;03m# Call _wrapit from within the except clause to ensure a potential\u001b[39;00m\n\u001b[1;32m 65\u001b[0m \u001b[38;5;66;03m# exception has a traceback chain.\u001b[39;00m\n\u001b[1;32m 66\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _wrapit(obj, method, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n", + "\u001b[0;31mIndexError\u001b[0m: index 192 is out of bounds for axis 0 with size 180" + ] + } + ], + "source": [ + "stackview.animate_curtain(image, labels, filename=\"segmentation_result.gif\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Save the label image as RGB PNG" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from skimage import color\n", + "rgb_labels = color.label2rgb(labels, bg_label=0)\n", + "imsave(\"segmented_nuclei.png\", (rgb_labels * 255).astype(np.uint8))" + ] + } + ], + "metadata": { + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 79a2f91c7fb95402b501700d4b17d04fe09892ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 11:32:14 +0000 Subject: [PATCH 3/4] Added jupyter to the requirements.txt file. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 989d660..ee454a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,4 @@ scipy napari-segment-blobs-and-things-with-membranes napari-simpleitk-image-processing opencv-python - +jupyter From 197fa2aed9e87a37202417f3efb1dda73008d7b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 11:42:57 +0000 Subject: [PATCH 4/4] Adding /human_mitosis_small.png created by notebook