图像调整:变换图像内容

颜色处理

大多数操作颜色通道的功能都在子模块中找到 skimage.color

颜色模型之间的转换

彩色图像可以使用不同的 color spaces 。最常见的颜色空间之一是 RGB space ,其中图像具有红色、绿色和蓝色通道。但是,其他颜色模型也被广泛使用,例如 HSV color model ,其中色调、饱和度和值是独立的通道,或者 CMYK model 用于印刷的。

skimage.color 提供将图像与不同颜色空间相互转换的实用程序函数。整数类型的数组可以通过以下转换操作转换为浮点类型:

>>> # bright saturated red
>>> red_pixel_rgb = np.array([[[255, 0, 0]]], dtype=np.uint8)
>>> color.rgb2hsv(red_pixel_rgb)
array([[[ 0.,  1.,  1.]]])
>>> # darker saturated blue
>>> dark_blue_pixel_rgb = np.array([[[0, 0, 100]]], dtype=np.uint8)
>>> color.rgb2hsv(dark_blue_pixel_rgb)
array([[[ 0.66666667,  1.        ,  0.39215686]]])
>>> # less saturated pink
>>> pink_pixel_rgb = np.array([[[255, 100, 255]]], dtype=np.uint8)
>>> color.rgb2hsv(pink_pixel_rgb)
array([[[ 0.83333333,  0.60784314,  1.        ]]])

从RGBA转换为RGB-通过Alpha混合去除Alpha通道

通过将RGBA图像与背景进行阿尔法混合,将RGBA图像转换为RGB图像 rgba2rgb() ::

>>> from skimage.color import rgba2rgb
>>> from skimage import data
>>> img_rgba = data.logo()
>>> img_rgb = rgba2rgb(img_rgba)

颜色和灰度值之间的转换

将RGB图像转换为灰度图像是通过 rgb2gray() ::

>>> from skimage.color import rgb2gray
>>> from skimage import data
>>> img = data.astronaut()
>>> img_gray = rgb2gray(img)

rgb2gray() 由于人眼对不同颜色的敏感度不同,因此使用颜色通道的非均匀权重。因此,这样的权重确保了 luminance preservation 从RGB到灰度::

>>> red_pixel = np.array([[[255, 0, 0]]], dtype=np.uint8)
>>> color.rgb2gray(red_pixel)
array([[ 0.2125]])
>>> green_pixel = np.array([[[0, 255, 0]]], dtype=np.uint8)
>>> color.rgb2gray(green_pixel)
array([[ 0.7154]])

使用将灰度图像转换为RGB gray2rgb() 只需在三个颜色通道上复制灰度值。

图像反转

反转图像也称为互补图像。对于二进制图像,True值变为False,反之亦然。对于灰度图像,像素值被数据类型的最大值与实际值的差值替换。对于RGB图像,对每个通道执行相同的操作。此操作可通过以下方式实现 skimage.util.invert() ::

>>> from skimage import util
>>> img = data.camera()
>>> inverted_img = util.invert(img)

使用标签绘制图像

label2rgb() 可用于使用标签数组将颜色叠加到灰度图像上,以编码要用相同颜色表示的区域。

../_images/sphx_glr_plot_join_segmentations_001.png

对比度和曝光

图像像素可以采用由 dtype 图像(请参见 图像数据类型及其含义 ),例如从0到255 uint8 图像或 [0, 1] 用于浮点图像。但是,大多数图像的值范围较窄(因为对比度较差),或者大多数像素值集中在可访问值的子范围内。 skimage.exposure 提供在更大范围内散布强度值的函数。

第一类方法计算与特定图像的像素值无关的强度的非线性函数。这种方法通常用于校正传感器或感受器(如人眼)的已知非线性。一个众所周知的例子是 Gamma correction ,实施于 adjust_gamma()

其他方法根据 直方图 图像的一部分。像素值的直方图是用 skimage.exposure.histogram() ::

>>> image = np.array([[1, 3], [1, 1]])
>>> exposure.histogram(image)
(array([3, 0, 1]), array([1, 2, 3]))

histogram() 返回每个值箱的像素数和箱的中心。的行为 histogram() 因此与之前的版本略有不同 numpy.histogram() ,它返回垃圾箱的边界。

最简单的对比度增强 rescale_intensity() 包括使用线性变换将像素值拉伸到整个允许范围:

>>> from skimage import exposure
>>> text = data.text()
>>> text.min(), text.max()
(10, 197)
>>> better_contrast = exposure.rescale_intensity(text)
>>> better_contrast.min(), better_contrast.max()
(0, 255)

即使图像使用整个值范围,有时值范围末端的权重也很少。在这种情况下,使用图像的百分位数剪裁像素值可以提高对比度(但会损失一些信息,因为此操作会使某些像素饱和):

>>> moon = data.moon()
>>> v_min, v_max = np.percentile(moon, (0.2, 99.8))
>>> v_min, v_max
(10.0, 186.0)
>>> better_contrast = exposure.rescale_intensity(
...                                     moon, in_range=(v_min, v_max))

该函数 equalize_hist() 将像素值的累积分布函数(CDF)映射到线性CDF上,以确保值范围的所有部分在图像中均匀表示。因此,在对比度较差的大区域,细节被增强。作为进一步的改进,直方图均衡可以在图像的子区域中使用 equalize_adapthist() ,以便校正整个图像上的曝光梯度。请参见示例 直方图均衡化

../_images/sphx_glr_plot_equalize_001.png

示例: