将灰度滤镜适应于RGB图像#

有许多滤镜设计用于处理灰度图像,但不适用于彩色图像。为了简化创建能够适应RGB图像的函数的过程,scikit-image提供了``adapt_rgb``装饰器。

要实际使用 adapt_rgb 装饰器,你必须决定如何调整 RGB 图像以适应灰度滤镜的使用。有两个预定义的处理程序:

each_channel

将每个RGB通道逐一传递给滤镜,然后将结果拼接回RGB图像中。

hsv_value

将RGB图像转换为HSV,并将值通道传递给滤镜。滤镜结果插入回HSV图像,并转换回RGB。

下面,我们演示了在几个灰度滤镜上使用 adapt_rgb

from skimage.color.adapt_rgb import adapt_rgb, each_channel, hsv_value
from skimage import filters


@adapt_rgb(each_channel)
def sobel_each(image):
    return filters.sobel(image)


@adapt_rgb(hsv_value)
def sobel_hsv(image):
    return filters.sobel(image)

我们可以像平常一样使用这些函数,但现在它们可以处理灰度图像和彩色图像。让我们用一张彩色图像来绘制结果:

from skimage import data
from skimage.exposure import rescale_intensity
import matplotlib.pyplot as plt

image = data.astronaut()

fig, (ax_each, ax_hsv) = plt.subplots(ncols=2, figsize=(14, 7))

# We use 1 - sobel_each(image) but this won't work if image is not normalized
ax_each.imshow(rescale_intensity(1 - sobel_each(image)))
ax_each.set_xticks([]), ax_each.set_yticks([])
ax_each.set_title("Sobel filter computed\n on individual RGB channels")

# We use 1 - sobel_hsv(image) but this won't work if image is not normalized
ax_hsv.imshow(rescale_intensity(1 - sobel_hsv(image)))
ax_hsv.set_xticks([]), ax_hsv.set_yticks([])
ax_hsv.set_title("Sobel filter computed\n on (V)alue converted image (HSV)")
Sobel filter computed  on individual RGB channels, Sobel filter computed  on (V)alue converted image (HSV)
Text(0.5, 1.0, 'Sobel filter computed\n on (V)alue converted image (HSV)')

请注意,值过滤后的图像保留了原始图像的颜色,但通道过滤后的图像以一种更令人惊讶的方式组合。在其他常见情况下,例如平滑处理,通道过滤后的图像将产生比值过滤后的图像更好的结果。

你也可以为 adapt_rgb 创建自己的处理函数。为此,只需创建一个具有以下签名的函数:

def handler(image_filter, image, *args, **kwargs):
    # Manipulate RGB image here...
    image = image_filter(image, *args, **kwargs)
    # Manipulate filtered image here...
    return image

请注意,adapt_rgb 处理程序是为图像作为第一个参数的过滤器编写的。

作为一个非常简单的例子,我们可以将任何RGB图像转换为灰度图像,然后返回过滤后的结果:

from skimage.color import rgb2gray


def as_gray(image_filter, image, *args, **kwargs):
    gray_image = rgb2gray(image)
    return image_filter(gray_image, *args, **kwargs)

创建一个使用 *args**kwargs 的签名来传递参数给过滤器是很重要的,这样被装饰的函数可以接受任意数量的位置参数和关键字参数。

最后,我们可以像之前一样将这个处理器与 adapt_rgb 一起使用:

@adapt_rgb(as_gray)
def sobel_gray(image):
    return filters.sobel(image)


fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(7, 7))

# We use 1 - sobel_gray(image) but this won't work if image is not normalized
ax.imshow(rescale_intensity(1 - sobel_gray(image)), cmap=plt.cm.gray)
ax.set_xticks([]), ax.set_yticks([])
ax.set_title("Sobel filter computed\n on the converted grayscale image")

plt.show()
Sobel filter computed  on the converted grayscale image

备注

通过检查数组形状的简单方法来检测RGB图像,因此 adapt_rgb 不推荐用于支持3D体积或非RGB空间中的彩色图像的函数。

脚本总运行时间: (0 分钟 0.518 秒)

由 Sphinx-Gallery 生成的图库