Helligkeit und Kontrast#

Bei der Visualisierung von Bildern in Jupyter Notebooks ist es wichtig, sie so darzustellen, dass ein Leser sehen kann, worüber wir schreiben. Daher ist die Anpassung von Helligkeit und Kontrast wichtig. Wir können dies durch Änderung des Anzeigebereichs, des Bereichs der angezeigten Grauwerte, erreichen.

Zu Demonstrationszwecken verwenden wir das cells3d Beispielbild von scikit-image.

import numpy as np
import matplotlib.pyplot as plt
from skimage.data import cells3d

Der cells3d Datensatz ist ein 4D-Bild. Mit Hilfe des Array-Zugriffs extrahieren wir eine einzelne 2D-Schicht und zeigen sie an.

image = cells3d()[30,0]
image.shape
(256, 256)
plt.imshow(image, cmap='gray')
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x1b3bba94a90>
../_images/2bcb7875f1dce717e64697cb1aa61f9616cc35dacc923f4b6b73722dd4a2b022.png

Beachten Sie, dass hier die Farbskala von 0 bis etwa 45000 reicht. Die matplotlib plt.imshow() Funktion passt den Bildkontrast an die minimalen und maximalen Werte an.

Die minimalen und maximalen Pixelwerte können auch so ermittelt werden:

min_value = image.min()
max_value = image.max()
print('min value = ', min_value)
print('max value = ', max_value)
min value =  277
max value =  44092

Wenn wir die Helligkeit erhöhen möchten, d.h. die Wahrnehmung, dass das Bild mehr Licht ausstrahlt, können wir den Anzeigebereich konfigurieren, indem wir sein Minimum vmin und Maximum vmax festlegen. Dies verbessert die Sichtbarkeit der Membranen.

plt.imshow(image, cmap='gray', vmax=10000)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x1b3bbb1dbb0>
../_images/8149ed3beb84e89872d2c2a89cb66f0e39ee1a57892f2d236e37239c0af8b187.png

Anpassung der Visualisierung unabhängig vom spezifischen Bild#

Das nächste Bild, das wir öffnen, hat möglicherweise einen ähnlichen Grauwertbereich oder auch nicht. Daher könnten wir das Histogramm des Bildes untersuchen und manuell einen besseren Schwellenwert erraten.

plt.hist(image.ravel())
(array([5.8622e+04, 5.6930e+03, 9.7800e+02, 1.6900e+02, 5.5000e+01,
        1.0000e+01, 5.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00]),
 array([  277. ,  4658.5,  9040. , 13421.5, 17803. , 22184.5, 26566. ,
        30947.5, 35329. , 39710.5, 44092. ]),
 <BarContainer object of 10 artists>)
../_images/d44ffd39ecd6ea006e2fb16e609b9cb0089641b9a1b5f471f9d83a108305e746.png

Histogramme von Bildern werden oft mit einer logarithmischen Skala angezeigt.

plt.hist(image.ravel(), log=True)
(array([5.8622e+04, 5.6930e+03, 9.7800e+02, 1.6900e+02, 5.5000e+01,
        1.0000e+01, 5.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00]),
 array([  277. ,  4658.5,  9040. , 13421.5, 17803. , 22184.5, 26566. ,
        30947.5, 35329. , 39710.5, 44092. ]),
 <BarContainer object of 10 artists>)
../_images/390cc18dcf90c400508434856b86afeef6268377c02979413dacdb4cf315d66d.png

Offensichtlich hat dieses Bild viele dunkle Grauwerte (< 20000) und wenige Werte > 40000.

Es könnte sinnvoll sein, die Visualisierung mit einem Prozentsatz zu konfigurieren. Angenommen, wir möchten das Bild so visualisieren, dass 95% der Pixel im Bereich liegen. Wir können dies mit der Perzentil-Methode von numpy tun. Wir werden am Ende des Semesters auch auf Perzentile zurückkommen.

upper_limit = np.percentile(image, 95)
upper_limit
6580.0
plt.imshow(image, cmap='gray', vmax=upper_limit)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x1b3bd17e670>
../_images/900b83be2052164812a59f814411961e6a79a3a890adfb8b7041a4b0e79bb58b.png

Übung#

Der cells3d Datensatz enthält einen weiteren Kanal, der die Zellkerne zeigt. Visualisieren Sie ihn so, dass 99% der unteren Grauwerte ordnungsgemäß visualisiert werden.

nuclei = cells3d()[30,1]
nuclei.shape
(256, 256)