Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
236 changes: 128 additions & 108 deletions docs/demo.ipynb

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions docs/label_display.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@
"</table>"
],
"text/plain": [
"StackViewNDArray([[0, 1],\n",
" [2, 3]])"
"[[0 1]\n",
" [2 3]]"
]
},
"execution_count": 2,
Expand Down Expand Up @@ -87,8 +87,8 @@
"</table>"
],
"text/plain": [
"StackViewNDArray([[4, 1],\n",
" [2, 3]])"
"[[4 1]\n",
" [2 3]]"
]
},
"execution_count": 3,
Expand Down Expand Up @@ -132,8 +132,8 @@
"</table>"
],
"text/plain": [
"StackViewNDArray([[5, 1],\n",
" [2, 3]])"
"[[5 1]\n",
" [2 3]]"
]
},
"execution_count": 4,
Expand All @@ -159,7 +159,7 @@
"<table>\n",
"<tr>\n",
"<td>\n",
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAACQpJREFUeJzt2LFtAlEUBVFApC7CmbcUROKQUijBgfsjdeQ2PlUsT2jOqeCGo3tca60DAAAZp+kBAAC8lgAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQMx5egDv6/G1TU+AXV2+f6cnwK7+fq7TExjiAQQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiztMDeF/b7X96Auzq4/M+PQF2dp0ewBAPIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYo5rrTU9AgCA1/EAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGKexQgSE/40h/EAAAAASUVORK5CYII=\"></img>\n",
"<img src=\"data:image/png;base64,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IEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBijpmZ7REAANyPBxAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQ8w90ghq0C8ySUgAAAABJRU5ErkJggg==\"></img>\n",
"</td>\n",
"<td style=\"text-align: center; vertical-align: top;\">\n",
"\n",
Expand All @@ -175,8 +175,8 @@
"</table>"
],
"text/plain": [
"StackViewNDArray([[ 4, 1],\n",
" [ 2, -3]])"
"[[ 4 1]\n",
" [ 2 -3]]"
]
},
"execution_count": 5,
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setuptools.setup(
name="stackview",
version="0.16.2",
version="0.17.0",
author="Robert Haase",
author_email="robert.haase@uni-leipzig.de",
description="Interactive image stack viewing in jupyter notebooks",
Expand Down
2 changes: 1 addition & 1 deletion stackview/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "0.16.2"
__version__ = "0.17.0"

from ._static_view import jupyter_displayable_output, insight
from ._utilities import merge_rgb
Expand Down
7 changes: 2 additions & 5 deletions stackview/_imshow.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,9 @@ def imshow(image,
colormap = imshow.labels_cmap

if min_display_intensity is None:
min_display_intensity = 0
min_display_intensity = min(0, image.min())
if max_display_intensity is None:
max_display_intensity = 65536

if image.min() < 0:
image = np.abs(image)
max_display_intensity = min_display_intensity + 65536

if plot is None:
import matplotlib.pyplot as plt
Expand Down
52 changes: 24 additions & 28 deletions stackview/_static_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,26 @@ class StackViewNDArray(np.ndarray):
def __new__(cls, input_array, library_name=None, help_url=None):
if 'cupy.ndarray' in str(type(input_array)):
input_array = input_array.get()
obj = np.asarray(input_array).view(cls)
input_array = np.asarray(input_array)
obj = super(StackViewNDArray, cls).__new__(cls, shape=input_array.shape, dtype=input_array.dtype)
obj.library_name = library_name
obj.help_url = help_url
obj[:] = input_array
return obj

def __array_finalize__(self, obj):
if obj is None: return
self.library_name = getattr(obj, 'library_name', None)
self.help_url = getattr(obj, 'help_url', None)
self.obj = obj

def __getattr__(self, name):
if name == "__repr__":
return self.__repr__
if name == "_repr_html_":
return self._repr_html_
return getattr(self.obj, name)

#self.obj = obj

def __repr__(self):
if _is_running_in_colab():
from IPython.display import display, HTML
display(HTML(self._repr_html_()))
return ""
else:
return self.obj.__repr__()
return str(self)


def _repr_html_(self):
Expand All @@ -71,19 +65,19 @@ def _repr_html_(self):
-------
HTML text with the image and some properties.
"""
if len(self.obj.shape) < 2:
return str(self.obj)
if len(self.shape) < 2:
return str(self)

import numpy as np
size_in_pixels = np.prod(self.obj.shape)
size_in_bytes = size_in_pixels * self.obj.dtype.itemsize
size_in_pixels = np.prod(self.shape)
size_in_bytes = size_in_pixels * self.dtype.itemsize

from ._image_widget import _is_label_image
labels = _is_label_image(self.obj)
labels = _is_label_image(self)

import matplotlib.pyplot as plt
from ._imshow import imshow
imshow(self.obj,
imshow(self,
labels=labels,
continue_drawing=True,
colorbar=not labels)
Expand All @@ -110,7 +104,7 @@ def _repr_html_(self):
import numpy as np

num_bins = 32
h, _ = np.histogram(self.obj, bins=num_bins)
h, _ = np.histogram(self, bins=num_bins)

plt.figure(figsize=(1.8, 1.2))
plt.bar(range(0, len(h)), h)
Expand All @@ -125,22 +119,24 @@ def _repr_html_(self):

histogram = _png_to_html(_plt_to_png())

min_intensity = self.obj.min()
max_intensity = self.obj.max()
min_intensity = self.min()
max_intensity = self.max()
min_max = "<tr><td>min</td><td>" + str(min_intensity) + "</td></tr>" + \
"<tr><td>max</td><td>" + str(max_intensity) + "</td></tr>"

if labels:
unique_labels = list(np.unique(self.obj))
unique_labels = list(np.unique(self))
if 0 in unique_labels:
unique_labels.remove(0)

num_labels = len(unique_labels)
min_max += "<tr><td>n labels</td><td>" + str(num_labels) + "</td></tr>"
if max_intensity != num_labels:
min_max += "<tr><td colspan=\"2\"><a href=\"https://haesleinhuepf.github.io/BioImageAnalysisNotebooks/20h_segmentation_post_processing/sequential_labeling.html\" style=\"color:darkred; font-weight:bold\">Not sequentially labeled!</a></td></tr>"
if min_intensity < 0:
min_max += "<tr><td colspan=\"2\" style=\"color:darkred; font-weight:bold\">Negative label values detected!</td></tr>"
else:
if max_intensity != num_labels:
min_max += "<tr><td colspan=\"2\"><a href=\"https://haesleinhuepf.github.io/BioImageAnalysisNotebooks/20h_segmentation_post_processing/sequential_labeling.html\" style=\"color:darkred; font-weight:bold\">Not sequentially labeled!</a></td></tr>"

else:
min_max = ""

Expand Down Expand Up @@ -236,8 +232,8 @@ def _imshow(image, title: str = None, labels: bool = False, min_display_intensit
continue_drawing: float
True: the next shown image can be visualized on top of the current one, e.g. with alpha = 0.5
"""
return
import numpy as np

if len(image.shape) == 3 and image.shape[2] == 3: # RGB image
import matplotlib.pyplot as plt
plt.imshow(image, vmin=min_display_intensity, vmax=max_display_intensity,
Expand All @@ -261,10 +257,10 @@ def _imshow(image, title: str = None, labels: bool = False, min_display_intensit
import matplotlib
import numpy as np

if not hasattr(_imshow, "labels_cmap"):
if not hasattr(imshow, "labels_cmap"):
from ._image_widget import _labels_lut
_imshow.labels_cmap = matplotlib.colors.ListedColormap(_labels_lut())
cmap = _imshow.labels_cmap
imshow.labels_cmap = matplotlib.colors.ListedColormap(_labels_lut())
cmap = imshow.labels_cmap

if min_display_intensity is None:
min_display_intensity = 0
Expand All @@ -284,4 +280,4 @@ def _imshow(image, title: str = None, labels: bool = False, min_display_intensit
plot.imshow(image, cmap=cmap, vmin=min_display_intensity, vmax=max_display_intensity,
interpolation='nearest', alpha=alpha)
if colorbar:
plot.colorbar()
plot.colorbar()