首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Image adjustment: transforming image content

颜色操作

大多数用于处理颜色通道的函数都可以在子模块中找到skimage.color

颜色模型之间的转换

彩色图像可以用不同的色彩空间表示。其中最常见的色彩空间是RGB空间,其中图像具有红色,绿色和蓝色通道。然而,其他颜色模型被广泛使用,例如HSV颜色模型,其中色调,饱和度和值是独立通道,或用于打印的CMYK模型

skimage.color提供实用功能来将图像转换到不同的颜色空间并从不同的颜色空间转换。整型数组可以通过转换操作转换为浮点类型:

代码语言:javascript
复制
>>> # 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图像与背景进行alpha混合将RGBA图像转换为RGB图像 rgba2rgb()

代码语言:javascript
复制
>>> from skimage.color import rgba2rgb
>>> from skimage import data
>>> img_rgba = data.logo()
>>> img_rgb = rgba2rgb(img_rgba)

颜色和灰度值之间的转换

将RGB图像转换为灰度图像可用 rgb2gray()

代码语言:javascript
复制
>>> from skimage.color import rgb2gray
>>> from skimage import data
>>> img = data.astronaut()
>>> img_gray = rgb2gray(img)

rgb2gray()由于人眼对不同颜色的不同敏感度,因此使用颜色通道的不均匀加权。因此,这种加权确保了从RGB到灰度的亮度保存

代码语言:javascript
复制
>>> 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()

代码语言:javascript
复制
>>> from skimage import util
>>> img = data.camera()
>>> inverted_img = util.invert(img)

用标签绘制图像

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

例子:

对比和曝光

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

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

其他方法根据图像的直方图重新分配像素值。像素值的直方图计算skimage.exposure.histogram()如下:

代码语言:javascript
复制
>>> image = np.array([[1, 3], [1, 1]])
>>> exposure.histogram(image)
(array([3, 0, 1]), array([1, 2, 3]))

histogram()返回每个值箱的像素数量以及箱体的中心。因此,行为与返回箱的边界的行为histogram()稍有不同numpy.histogram()

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

代码语言:javascript
复制
>>> 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)

即使图像使用整个数值范围,有时在数值范围的末尾也没有重量。在这种情况下,使用图像的百分比剪裁像素值可以提高对比度(以牺牲某些信息损失为代价,因为某些像素会被此操作饱和):

代码语言:javascript
复制
>>> 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(),以校正图像上的曝光梯度。请参阅示例直方图均衡

例子:

扫码关注腾讯云开发者

领取腾讯云代金券