diff --git a/demo/measurement/label_statistics.ipynb b/demo/measurement/label_statistics.ipynb new file mode 100644 index 00000000..964421c6 --- /dev/null +++ b/demo/measurement/label_statistics.ipynb @@ -0,0 +1,1259 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "id": "10042491-842e-4ce0-aaa3-7a80504886bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.18.1'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pyclesperanto_prototype as cle\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "cle.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9c66a333-a0dc-4383-a833-f8e8ee70ecc7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "cle._ image
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
shape(40, 40)
dtypefloat32
size6.2 kB
min0.0
max1521.0
\n", + "\n", + "
" + ], + "text/plain": [ + "cl.OCLArray([[0.000e+00, 0.000e+00, 0.000e+00, ..., 0.000e+00, 0.000e+00,\n", + " 0.000e+00],\n", + " [0.000e+00, 1.000e+00, 2.000e+00, ..., 3.700e+01, 3.800e+01,\n", + " 3.900e+01],\n", + " [0.000e+00, 2.000e+00, 4.000e+00, ..., 7.400e+01, 7.600e+01,\n", + " 7.800e+01],\n", + " ...,\n", + " [0.000e+00, 3.700e+01, 7.400e+01, ..., 1.369e+03, 1.406e+03,\n", + " 1.443e+03],\n", + " [0.000e+00, 3.800e+01, 7.600e+01, ..., 1.406e+03, 1.444e+03,\n", + " 1.482e+03],\n", + " [0.000e+00, 3.900e+01, 7.800e+01, ..., 1.443e+03, 1.482e+03,\n", + " 1.521e+03]], dtype=float32)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "image1 = cle.create((40,40))\n", + "cle.set_ramp_x(image1)\n", + "image2 = cle.create((40,40))\n", + "cle.set_ramp_y(image2)\n", + "\n", + "image = image1 * image2\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ebbbb474-97a2-4675-ad23-a3c814673c0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "cle._ image
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
shape(40, 40)
dtypeuint32
size6.2 kB
min1.0
max4.0
\n", + "\n", + "
" + ], + "text/plain": [ + "cl.OCLArray([[1, 1, 1, ..., 2, 2, 2],\n", + " [1, 1, 1, ..., 2, 2, 2],\n", + " [1, 1, 1, ..., 2, 2, 2],\n", + " ...,\n", + " [1, 1, 1, ..., 3, 3, 3],\n", + " [1, 1, 1, ..., 3, 3, 3],\n", + " [1, 1, 1, ..., 3, 3, 3]], dtype=uint32)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "label_image = cle.scale(cle.asarray([\n", + " [1, 1, 2, 2],\n", + " [1, 4, 4, 2],\n", + " [1, 4, 4, 3],\n", + " [1, 1, 3, 3],\n", + "]), factor_x=10, factor_y=10, auto_size=True).astype(np.uint32)\n", + "label_image" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e7d24d84-2632-40d1-aab1-0d93b620cce6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'label': array([1, 2, 3, 4]),\n", + " 'original_label': array([1, 2, 3, 4]),\n", + " 'bbox_min_x': array([ 0., 20., 20., 10.], dtype=float32),\n", + " 'bbox_min_y': array([ 0., 0., 20., 10.], dtype=float32),\n", + " 'bbox_min_z': array([0., 0., 0., 0.], dtype=float32),\n", + " 'bbox_max_x': array([19., 39., 39., 29.], dtype=float32),\n", + " 'bbox_max_y': array([39., 19., 39., 29.], dtype=float32),\n", + " 'bbox_max_z': array([0., 0., 0., 0.], dtype=float32),\n", + " 'bbox_width': array([20., 20., 20., 20.], dtype=float32),\n", + " 'bbox_height': array([40., 20., 20., 20.], dtype=float32),\n", + " 'bbox_depth': array([1., 1., 1., 1.], dtype=float32),\n", + " 'min_intensity': array([ 0., 0., 600., 100.], dtype=float32),\n", + " 'max_intensity': array([ 741., 741., 1521., 841.], dtype=float32),\n", + " 'sum_intensity': array([ 91650., 76575., 288075., 152100.], dtype=float32),\n", + " 'area': array([600., 300., 300., 400.], dtype=float32),\n", + " 'mean_intensity': array([152.75, 255.25, 960.25, 380.25], dtype=float32),\n", + " 'sum_intensity_times_x': array([1074450., 2550975., 9170475., 3225300.], dtype=float32),\n", + " 'mass_center_x': array([11.723405, 33.31342 , 31.833637, 21.205128], dtype=float32),\n", + " 'sum_intensity_times_y': array([2703450., 921975., 9170475., 3225300.], dtype=float32),\n", + " 'mass_center_y': array([29.497545, 12.040156, 31.833637, 21.205128], dtype=float32),\n", + " 'sum_intensity_times_z': array([0., 0., 0., 0.], dtype=float32),\n", + " 'mass_center_z': array([0., 0., 0., 0.], dtype=float32),\n", + " 'sum_x': array([4700., 9350., 9350., 7800.], dtype=float32),\n", + " 'centroid_x': array([ 7.8333335, 31.166668 , 31.166668 , 19.5 ], dtype=float32),\n", + " 'sum_y': array([11700., 2350., 9350., 7800.], dtype=float32),\n", + " 'centroid_y': array([19.5 , 7.8333335, 31.166668 , 19.5 ], dtype=float32),\n", + " 'sum_z': array([0., 0., 0., 0.], dtype=float32),\n", + " 'centroid_z': array([0., 0., 0., 0.], dtype=float32),\n", + " 'sum_distance_to_centroid': array([7803.0596, 2169.439 , 2169.4387, 3057.9111], dtype=float32),\n", + " 'mean_distance_to_centroid': array([13.005099 , 7.2314634, 7.2314625, 7.644778 ], dtype=float32),\n", + " 'sum_distance_to_mass_center': array([9336.952 , 2461.59 , 2172.0378, 3159.9648], dtype=float32),\n", + " 'mean_distance_to_mass_center': array([15.561587, 8.2053 , 7.240126, 7.899912], dtype=float32),\n", + " 'standard_deviation_intensity': array([176.3723 , 198.25412, 207.15257, 162.45674], dtype=float32),\n", + " 'max_distance_to_centroid': array([22.47097 , 13.64022 , 13.640219, 13.435029], dtype=float32),\n", + " 'max_distance_to_mass_center': array([31.741825, 17.95028 , 13.83444 , 15.846443], dtype=float32),\n", + " 'mean_max_distance_to_centroid_ratio': array([1.7278584, 1.8862323, 1.8862324, 1.7574127], dtype=float32),\n", + " 'mean_max_distance_to_mass_center_ratio': array([2.0397549, 2.1876445, 1.910801 , 2.0059013], dtype=float32)}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "statistics = cle.statistics_of_labelled_pixels(image, label_image)\n", + "statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a4b99512-c217-419d-a7f0-eee14831987d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
labeloriginal_labelbbox_min_xbbox_min_ybbox_min_zbbox_max_xbbox_max_ybbox_max_zbbox_widthbbox_height...centroid_zsum_distance_to_centroidmean_distance_to_centroidsum_distance_to_mass_centermean_distance_to_mass_centerstandard_deviation_intensitymax_distance_to_centroidmax_distance_to_mass_centermean_max_distance_to_centroid_ratiomean_max_distance_to_mass_center_ratio
0110.00.00.019.039.00.020.040.0...0.07803.05957013.0050999336.95214815.561587176.37229922.47097031.7418251.7278582.039755
12220.00.00.039.019.00.020.020.0...0.02169.4389657.2314632461.5900888.205300198.25412013.64022017.9502791.8862322.187644
23320.020.00.039.039.00.020.020.0...0.02169.4387217.2314622172.0378427.240126207.15257313.64021913.8344401.8862321.910801
34410.010.00.029.029.00.020.020.0...0.03057.9111337.6447783159.9648447.899912162.45674113.43502915.8464431.7574132.005901
\n", + "

4 rows × 37 columns

\n", + "
" + ], + "text/plain": [ + " label original_label bbox_min_x bbox_min_y bbox_min_z bbox_max_x \\\n", + "0 1 1 0.0 0.0 0.0 19.0 \n", + "1 2 2 20.0 0.0 0.0 39.0 \n", + "2 3 3 20.0 20.0 0.0 39.0 \n", + "3 4 4 10.0 10.0 0.0 29.0 \n", + "\n", + " bbox_max_y bbox_max_z bbox_width bbox_height ... centroid_z \\\n", + "0 39.0 0.0 20.0 40.0 ... 0.0 \n", + "1 19.0 0.0 20.0 20.0 ... 0.0 \n", + "2 39.0 0.0 20.0 20.0 ... 0.0 \n", + "3 29.0 0.0 20.0 20.0 ... 0.0 \n", + "\n", + " sum_distance_to_centroid mean_distance_to_centroid \\\n", + "0 7803.059570 13.005099 \n", + "1 2169.438965 7.231463 \n", + "2 2169.438721 7.231462 \n", + "3 3057.911133 7.644778 \n", + "\n", + " sum_distance_to_mass_center mean_distance_to_mass_center \\\n", + "0 9336.952148 15.561587 \n", + "1 2461.590088 8.205300 \n", + "2 2172.037842 7.240126 \n", + "3 3159.964844 7.899912 \n", + "\n", + " standard_deviation_intensity max_distance_to_centroid \\\n", + "0 176.372299 22.470970 \n", + "1 198.254120 13.640220 \n", + "2 207.152573 13.640219 \n", + "3 162.456741 13.435029 \n", + "\n", + " max_distance_to_mass_center mean_max_distance_to_centroid_ratio \\\n", + "0 31.741825 1.727858 \n", + "1 17.950279 1.886232 \n", + "2 13.834440 1.886232 \n", + "3 15.846443 1.757413 \n", + "\n", + " mean_max_distance_to_mass_center_ratio \n", + "0 2.039755 \n", + "1 2.187644 \n", + "2 1.910801 \n", + "3 2.005901 \n", + "\n", + "[4 rows x 37 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table = pd.DataFrame(statistics)\n", + "table" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "685ba6c8-a4b7-4226-99f8-33e37dd4de0c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countmeanstdmin25%50%75%max
label4.02.500000e+001.290994e+001.000000e+001.750000e+002.500000e+003.250000e+004.000000e+00
original_label4.02.500000e+001.290994e+001.000000e+001.750000e+002.500000e+003.250000e+004.000000e+00
bbox_min_x4.01.250000e+019.574271e+000.000000e+007.500000e+001.500000e+012.000000e+012.000000e+01
bbox_min_y4.07.500000e+009.574271e+000.000000e+000.000000e+005.000000e+001.250000e+012.000000e+01
bbox_min_z4.00.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+00
bbox_max_x4.03.150000e+019.574271e+001.900000e+012.650000e+013.400000e+013.900000e+013.900000e+01
bbox_max_y4.03.150000e+019.574271e+001.900000e+012.650000e+013.400000e+013.900000e+013.900000e+01
bbox_max_z4.00.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+00
bbox_width4.02.000000e+010.000000e+002.000000e+012.000000e+012.000000e+012.000000e+012.000000e+01
bbox_height4.02.500000e+011.000000e+012.000000e+012.000000e+012.000000e+012.500000e+014.000000e+01
bbox_depth4.01.000000e+000.000000e+001.000000e+001.000000e+001.000000e+001.000000e+001.000000e+00
min_intensity4.01.750000e+022.872281e+020.000000e+000.000000e+005.000000e+012.250000e+026.000000e+02
max_intensity4.09.610000e+023.762978e+027.410000e+027.410000e+027.910000e+021.011000e+031.521000e+03
sum_intensity4.01.521000e+059.634561e+047.657500e+048.788125e+041.218750e+051.860938e+052.880750e+05
area4.04.000000e+021.414214e+023.000000e+023.000000e+023.500000e+024.500000e+026.000000e+02
mean_intensity4.04.371250e+023.609442e+021.527500e+022.296250e+023.177500e+025.252500e+029.602500e+02
sum_intensity_times_x4.04.005300e+063.558669e+061.074450e+062.181844e+062.888138e+064.711594e+069.170475e+06
mass_center_x4.02.451890e+011.009215e+011.172340e+011.883470e+012.651938e+013.220358e+013.331342e+01
sum_intensity_times_y4.04.005300e+063.581859e+069.219750e+052.258081e+062.964375e+064.711594e+069.170475e+06
mass_center_y4.02.364412e+018.980190e+001.204016e+011.891388e+012.535134e+013.008157e+013.183364e+01
sum_intensity_times_z4.00.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+00
mass_center_z4.00.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+00
sum_x4.07.800000e+032.192031e+034.700000e+037.025000e+038.575000e+039.350000e+039.350000e+03
centroid_x4.02.241667e+011.116998e+017.833333e+001.658333e+012.533333e+013.116667e+013.116667e+01
sum_y4.07.800000e+033.971356e+032.350000e+036.437500e+038.575000e+039.937500e+031.170000e+04
centroid_y4.01.950000e+019.525794e+007.833333e+001.658333e+011.950000e+012.241667e+013.116667e+01
sum_z4.00.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+00
centroid_z4.00.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+000.000000e+00
sum_distance_to_centroid4.03.799962e+032.701397e+032.169439e+032.169439e+032.613675e+034.244198e+037.803060e+03
mean_distance_to_centroid4.08.778201e+002.824660e+007.231462e+007.231463e+007.438121e+008.984858e+001.300510e+01
sum_distance_to_mass_center4.04.282636e+033.394964e+032.172038e+032.389202e+032.810777e+034.704212e+039.336952e+03
mean_distance_to_mass_center4.09.726731e+003.910702e+007.240126e+007.734965e+008.052606e+001.004437e+011.556159e+01
standard_deviation_intensity4.01.860589e+022.036794e+011.624567e+021.728934e+021.873132e+022.004787e+022.071526e+02
max_distance_to_centroid4.01.579661e+014.450625e+001.343503e+011.358892e+011.364022e+011.584791e+012.247097e+01
max_distance_to_mass_center4.01.984325e+018.108425e+001.383444e+011.534344e+011.689836e+012.139817e+013.174183e+01
mean_max_distance_to_centroid_ratio4.01.814434e+008.377899e-021.727858e+001.750024e+001.821822e+001.886232e+001.886232e+00
mean_max_distance_to_mass_center_ratio4.02.036026e+001.148780e-011.910801e+001.982126e+002.022828e+002.076727e+002.187644e+00
\n", + "
" + ], + "text/plain": [ + " count mean std \\\n", + "label 4.0 2.500000e+00 1.290994e+00 \n", + "original_label 4.0 2.500000e+00 1.290994e+00 \n", + "bbox_min_x 4.0 1.250000e+01 9.574271e+00 \n", + "bbox_min_y 4.0 7.500000e+00 9.574271e+00 \n", + "bbox_min_z 4.0 0.000000e+00 0.000000e+00 \n", + "bbox_max_x 4.0 3.150000e+01 9.574271e+00 \n", + "bbox_max_y 4.0 3.150000e+01 9.574271e+00 \n", + "bbox_max_z 4.0 0.000000e+00 0.000000e+00 \n", + "bbox_width 4.0 2.000000e+01 0.000000e+00 \n", + "bbox_height 4.0 2.500000e+01 1.000000e+01 \n", + "bbox_depth 4.0 1.000000e+00 0.000000e+00 \n", + "min_intensity 4.0 1.750000e+02 2.872281e+02 \n", + "max_intensity 4.0 9.610000e+02 3.762978e+02 \n", + "sum_intensity 4.0 1.521000e+05 9.634561e+04 \n", + "area 4.0 4.000000e+02 1.414214e+02 \n", + "mean_intensity 4.0 4.371250e+02 3.609442e+02 \n", + "sum_intensity_times_x 4.0 4.005300e+06 3.558669e+06 \n", + "mass_center_x 4.0 2.451890e+01 1.009215e+01 \n", + "sum_intensity_times_y 4.0 4.005300e+06 3.581859e+06 \n", + "mass_center_y 4.0 2.364412e+01 8.980190e+00 \n", + "sum_intensity_times_z 4.0 0.000000e+00 0.000000e+00 \n", + "mass_center_z 4.0 0.000000e+00 0.000000e+00 \n", + "sum_x 4.0 7.800000e+03 2.192031e+03 \n", + "centroid_x 4.0 2.241667e+01 1.116998e+01 \n", + "sum_y 4.0 7.800000e+03 3.971356e+03 \n", + "centroid_y 4.0 1.950000e+01 9.525794e+00 \n", + "sum_z 4.0 0.000000e+00 0.000000e+00 \n", + "centroid_z 4.0 0.000000e+00 0.000000e+00 \n", + "sum_distance_to_centroid 4.0 3.799962e+03 2.701397e+03 \n", + "mean_distance_to_centroid 4.0 8.778201e+00 2.824660e+00 \n", + "sum_distance_to_mass_center 4.0 4.282636e+03 3.394964e+03 \n", + "mean_distance_to_mass_center 4.0 9.726731e+00 3.910702e+00 \n", + "standard_deviation_intensity 4.0 1.860589e+02 2.036794e+01 \n", + "max_distance_to_centroid 4.0 1.579661e+01 4.450625e+00 \n", + "max_distance_to_mass_center 4.0 1.984325e+01 8.108425e+00 \n", + "mean_max_distance_to_centroid_ratio 4.0 1.814434e+00 8.377899e-02 \n", + "mean_max_distance_to_mass_center_ratio 4.0 2.036026e+00 1.148780e-01 \n", + "\n", + " min 25% \\\n", + "label 1.000000e+00 1.750000e+00 \n", + "original_label 1.000000e+00 1.750000e+00 \n", + "bbox_min_x 0.000000e+00 7.500000e+00 \n", + "bbox_min_y 0.000000e+00 0.000000e+00 \n", + "bbox_min_z 0.000000e+00 0.000000e+00 \n", + "bbox_max_x 1.900000e+01 2.650000e+01 \n", + "bbox_max_y 1.900000e+01 2.650000e+01 \n", + "bbox_max_z 0.000000e+00 0.000000e+00 \n", + "bbox_width 2.000000e+01 2.000000e+01 \n", + "bbox_height 2.000000e+01 2.000000e+01 \n", + "bbox_depth 1.000000e+00 1.000000e+00 \n", + "min_intensity 0.000000e+00 0.000000e+00 \n", + "max_intensity 7.410000e+02 7.410000e+02 \n", + "sum_intensity 7.657500e+04 8.788125e+04 \n", + "area 3.000000e+02 3.000000e+02 \n", + "mean_intensity 1.527500e+02 2.296250e+02 \n", + "sum_intensity_times_x 1.074450e+06 2.181844e+06 \n", + "mass_center_x 1.172340e+01 1.883470e+01 \n", + "sum_intensity_times_y 9.219750e+05 2.258081e+06 \n", + "mass_center_y 1.204016e+01 1.891388e+01 \n", + "sum_intensity_times_z 0.000000e+00 0.000000e+00 \n", + "mass_center_z 0.000000e+00 0.000000e+00 \n", + "sum_x 4.700000e+03 7.025000e+03 \n", + "centroid_x 7.833333e+00 1.658333e+01 \n", + "sum_y 2.350000e+03 6.437500e+03 \n", + "centroid_y 7.833333e+00 1.658333e+01 \n", + "sum_z 0.000000e+00 0.000000e+00 \n", + "centroid_z 0.000000e+00 0.000000e+00 \n", + "sum_distance_to_centroid 2.169439e+03 2.169439e+03 \n", + "mean_distance_to_centroid 7.231462e+00 7.231463e+00 \n", + "sum_distance_to_mass_center 2.172038e+03 2.389202e+03 \n", + "mean_distance_to_mass_center 7.240126e+00 7.734965e+00 \n", + "standard_deviation_intensity 1.624567e+02 1.728934e+02 \n", + "max_distance_to_centroid 1.343503e+01 1.358892e+01 \n", + "max_distance_to_mass_center 1.383444e+01 1.534344e+01 \n", + "mean_max_distance_to_centroid_ratio 1.727858e+00 1.750024e+00 \n", + "mean_max_distance_to_mass_center_ratio 1.910801e+00 1.982126e+00 \n", + "\n", + " 50% 75% \\\n", + "label 2.500000e+00 3.250000e+00 \n", + "original_label 2.500000e+00 3.250000e+00 \n", + "bbox_min_x 1.500000e+01 2.000000e+01 \n", + "bbox_min_y 5.000000e+00 1.250000e+01 \n", + "bbox_min_z 0.000000e+00 0.000000e+00 \n", + "bbox_max_x 3.400000e+01 3.900000e+01 \n", + "bbox_max_y 3.400000e+01 3.900000e+01 \n", + "bbox_max_z 0.000000e+00 0.000000e+00 \n", + "bbox_width 2.000000e+01 2.000000e+01 \n", + "bbox_height 2.000000e+01 2.500000e+01 \n", + "bbox_depth 1.000000e+00 1.000000e+00 \n", + "min_intensity 5.000000e+01 2.250000e+02 \n", + "max_intensity 7.910000e+02 1.011000e+03 \n", + "sum_intensity 1.218750e+05 1.860938e+05 \n", + "area 3.500000e+02 4.500000e+02 \n", + "mean_intensity 3.177500e+02 5.252500e+02 \n", + "sum_intensity_times_x 2.888138e+06 4.711594e+06 \n", + "mass_center_x 2.651938e+01 3.220358e+01 \n", + "sum_intensity_times_y 2.964375e+06 4.711594e+06 \n", + "mass_center_y 2.535134e+01 3.008157e+01 \n", + "sum_intensity_times_z 0.000000e+00 0.000000e+00 \n", + "mass_center_z 0.000000e+00 0.000000e+00 \n", + "sum_x 8.575000e+03 9.350000e+03 \n", + "centroid_x 2.533333e+01 3.116667e+01 \n", + "sum_y 8.575000e+03 9.937500e+03 \n", + "centroid_y 1.950000e+01 2.241667e+01 \n", + "sum_z 0.000000e+00 0.000000e+00 \n", + "centroid_z 0.000000e+00 0.000000e+00 \n", + "sum_distance_to_centroid 2.613675e+03 4.244198e+03 \n", + "mean_distance_to_centroid 7.438121e+00 8.984858e+00 \n", + "sum_distance_to_mass_center 2.810777e+03 4.704212e+03 \n", + "mean_distance_to_mass_center 8.052606e+00 1.004437e+01 \n", + "standard_deviation_intensity 1.873132e+02 2.004787e+02 \n", + "max_distance_to_centroid 1.364022e+01 1.584791e+01 \n", + "max_distance_to_mass_center 1.689836e+01 2.139817e+01 \n", + "mean_max_distance_to_centroid_ratio 1.821822e+00 1.886232e+00 \n", + "mean_max_distance_to_mass_center_ratio 2.022828e+00 2.076727e+00 \n", + "\n", + " max \n", + "label 4.000000e+00 \n", + "original_label 4.000000e+00 \n", + "bbox_min_x 2.000000e+01 \n", + "bbox_min_y 2.000000e+01 \n", + "bbox_min_z 0.000000e+00 \n", + "bbox_max_x 3.900000e+01 \n", + "bbox_max_y 3.900000e+01 \n", + "bbox_max_z 0.000000e+00 \n", + "bbox_width 2.000000e+01 \n", + "bbox_height 4.000000e+01 \n", + "bbox_depth 1.000000e+00 \n", + "min_intensity 6.000000e+02 \n", + "max_intensity 1.521000e+03 \n", + "sum_intensity 2.880750e+05 \n", + "area 6.000000e+02 \n", + "mean_intensity 9.602500e+02 \n", + "sum_intensity_times_x 9.170475e+06 \n", + "mass_center_x 3.331342e+01 \n", + "sum_intensity_times_y 9.170475e+06 \n", + "mass_center_y 3.183364e+01 \n", + "sum_intensity_times_z 0.000000e+00 \n", + "mass_center_z 0.000000e+00 \n", + "sum_x 9.350000e+03 \n", + "centroid_x 3.116667e+01 \n", + "sum_y 1.170000e+04 \n", + "centroid_y 3.116667e+01 \n", + "sum_z 0.000000e+00 \n", + "centroid_z 0.000000e+00 \n", + "sum_distance_to_centroid 7.803060e+03 \n", + "mean_distance_to_centroid 1.300510e+01 \n", + "sum_distance_to_mass_center 9.336952e+03 \n", + "mean_distance_to_mass_center 1.556159e+01 \n", + "standard_deviation_intensity 2.071526e+02 \n", + "max_distance_to_centroid 2.247097e+01 \n", + "max_distance_to_mass_center 3.174183e+01 \n", + "mean_max_distance_to_centroid_ratio 1.886232e+00 \n", + "mean_max_distance_to_mass_center_ratio 2.187644e+00 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table.describe().T" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3b1d0ed1-856a-4c81-a6b3-51d32842bf4f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['label', 'original_label', 'bbox_min_x', 'bbox_min_y', 'bbox_min_z',\n", + " 'bbox_max_x', 'bbox_max_y', 'bbox_max_z', 'bbox_width', 'bbox_height',\n", + " 'bbox_depth', 'min_intensity', 'max_intensity', 'sum_intensity', 'area',\n", + " 'mean_intensity', 'sum_intensity_times_x', 'mass_center_x',\n", + " 'sum_intensity_times_y', 'mass_center_y', 'sum_intensity_times_z',\n", + " 'mass_center_z', 'sum_x', 'centroid_x', 'sum_y', 'centroid_y', 'sum_z',\n", + " 'centroid_z', 'sum_distance_to_centroid', 'mean_distance_to_centroid',\n", + " 'sum_distance_to_mass_center', 'mean_distance_to_mass_center',\n", + " 'standard_deviation_intensity', 'max_distance_to_centroid',\n", + " 'max_distance_to_mass_center', 'mean_max_distance_to_centroid_ratio',\n", + " 'mean_max_distance_to_mass_center_ratio'],\n", + " dtype='object')" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ebc0f675-1ff9-4b75-ba0c-ef04f4fee037", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The last object had the label 4\n" + ] + } + ], + "source": [ + "print(\"The last object had the label\", \n", + " statistics[\"label\"][-1]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "f59becfa-9f07-43df-bbdf-81cb6bc55656", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The last object had the label 4\n" + ] + } + ], + "source": [ + "print(\"The last object had the label\", \n", + " table[\"label\"].tolist()[-1]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "3e75337a-1e8c-4690-888e-80b561bb0095", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The objects had area measurements of [600.0, 300.0, 300.0, 400.0]\n" + ] + } + ], + "source": [ + "print(\"The objects had area measurements of\",\n", + " table[\"area\"].tolist()\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7cfab847-375d-4b0a-adcc-d1d02d0741fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The average area of all objects was 400.0\n" + ] + } + ], + "source": [ + "print(\"The average area of all objects was\",\n", + " np.mean(table[\"area\"].tolist())\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "764d0d7f-3470-439d-bfe3-2f5c3a2e2196", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7919109-06ec-4f89-82a6-d2019672bedd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2192eb02-59ad-4443-8728-0d3ccbdf7aa9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b64afb6-a9d3-4d8e-9f6d-0d678504623c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6193d45-54bd-4133-b85b-f5ec8ddcf7d9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a2c880f-a564-4eb9-9ade-bfce72b93f97", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "\n", + "'original_label', 'bbox_min_x', 'bbox_min_y', 'bbox_min_z',\n", + " 'bbox_max_x', 'bbox_max_y', 'bbox_max_z', 'bbox_width', 'bbox_height',\n", + " 'bbox_depth', 'min_intensity', 'max_intensity', 'sum_intensity', 'area',\n", + " 'mean_intensity', 'sum_intensity_times_x', 'mass_center_x',\n", + " 'sum_intensity_times_y', 'mass_center_y', 'sum_intensity_times_z',\n", + " 'mass_center_z', 'sum_x', 'centroid_x', 'sum_y', 'centroid_y', 'sum_z',\n", + " 'centroid_z', 'sum_distance_to_centroid', 'mean_distance_to_centroid',\n", + " 'sum_distance_to_mass_center', 'mean_distance_to_mass_center',\n", + " 'standard_deviation_intensity', 'max_distance_to_centroid',\n", + " 'max_distance_to_mass_center', 'mean_max_distance_to_centroid_ratio',\n", + " 'mean_max_distance_to_mass_center_ratio'" + ] + }, + { + "cell_type": "markdown", + "id": "b1b99125-bc12-49b0-94b9-704283d9f0c4", + "metadata": {}, + "source": [ + "The column `original_label` can be used for debugging. If the label image was subsequently labeled, this column will be identical with `label`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9c6475e6-6728-48ce-8065-c21f7d64e020", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3 4 5 6]\n", + "[1 2 3 4 5 6]\n" + ] + } + ], + "source": [ + "test_label_image = cle.asarray([\n", + " [0, 1, 5, 6]\n", + "])\n", + "\n", + "test_stats = cle.statistics_of_labelled_pixels(label_image=test_label_image)\n", + "\n", + "print(test_stats[\"label\"])\n", + "print(test_stats[\"original_label\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f075215-e5a1-45f4-b914-74258a611216", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyclesperanto_prototype/_tier9/_statistics_of_background_and_labelled_pixels.py b/pyclesperanto_prototype/_tier9/_statistics_of_background_and_labelled_pixels.py index 2a8af2dc..9ff10c6b 100644 --- a/pyclesperanto_prototype/_tier9/_statistics_of_background_and_labelled_pixels.py +++ b/pyclesperanto_prototype/_tier9/_statistics_of_background_and_labelled_pixels.py @@ -1,5 +1,3 @@ -from skimage.measure import regionprops - from .._tier0 import Image from .._tier0 import create_none from .._tier0 import plugin_function @@ -44,7 +42,8 @@ def statistics_of_background_and_labelled_pixels(source : Image = None, labelmap for r in regionprops: r.original_label = r.label - 1 - return regionprops - + # see https://github.com/clEsperanto/pyclesperanto_prototype/issues/199 + regionprops['label'] = regionprops['original_label'] + return regionprops diff --git a/pyclesperanto_prototype/_tier9/_statistics_of_labelled_pixels.py b/pyclesperanto_prototype/_tier9/_statistics_of_labelled_pixels.py index 973366f5..b0b8c6e5 100644 --- a/pyclesperanto_prototype/_tier9/_statistics_of_labelled_pixels.py +++ b/pyclesperanto_prototype/_tier9/_statistics_of_labelled_pixels.py @@ -1,3 +1,4 @@ +import warnings from warnings import warn from .._tier0 import Image @@ -290,4 +291,28 @@ def statistics_of_labelled_pixels(intensity_image : Image = None, label_image : region_props['mean_max_distance_to_mass_center_ratio'] = region_props['max_distance_to_mass_center'] / region_props[ 'mean_distance_to_mass_center'] + # determine which labels were actually present in the label image + min_intensity = region_props['min_intensity'] + max_intensity = region_props['max_intensity'] + mask = min_intensity <= max_intensity + + # remove the other labels from the measurements + for key in region_props.keys(): + region_props[key] = region_props[key][mask] + + region_props = MyDict(region_props) + return region_props + +# source: https://stackoverflow.com/questions/54095279/how-to-make-a-dict-key-deprecated +class MyDict(dict): + old_keys_to_new_keys = {'area': 'pixel_count'} + old_keys_to_new_keys = {'original_label': 'label'} + + def __getitem__(self, key): + if key in self.old_keys_to_new_keys: + msg = 'The key `{}` in statistics_of_labelled_pixels is deprecated. Use `{}` instead.'.format(key, self.old_keys_to_new_keys[key]) + warnings.warn(msg, FutureWarning) + return super().__getitem__(key) + +