亮度和对比度#

在Jupyter笔记本中可视化图像时,以读者能够看到我们所写内容的方式显示它们很重要。因此,调整亮度和对比度是很重要的。我们可以通过修改显示范围(显示的灰度值范围)来实现这一点。

为了演示目的,我们使用scikit-image的cells3d示例图像

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

cells3d数据集是一个4D图像。使用数组访问,我们提取一个单独的2D切片并显示它。

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

注意这里颜色条的范围从0到约45000。matplotlib的plt.imshow()函数将图像对比度调整到最小和最大值。

最小和最大像素值也可以这样获得:

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

如果我们想增加亮度,即图像发出更多光的感知,我们可以通过设置其最小值vmin和最大值vmax来配置显示范围。这可以改善膜的可见度。

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

独立于特定图像调整可视化#

我们下一次打开的图像可能会或可能不会有类似的灰度值范围。因此,我们可以检查图像的直方图并手动猜测一个更好的阈值。

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

图像的直方图通常以对数尺度显示。

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

显然,这个图像有很多暗灰色值(< 20000)和少量值 > 40000。

使用百分比来配置可视化可能更有意义。假设我们想要以95%的像素在范围内的方式可视化图像。我们可以使用numpy的百分位数方法来做到这一点。我们在学期末还会再次讨论百分位数。

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

练习#

cells3d数据集包含另一个显示细胞核的通道。将其可视化,使99%的较低灰度值得到适当显示。

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