将灰度滤镜应用于 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 分 2.019 秒)

由 Sphinx-Gallery 生成的图库