将灰度滤波器应用于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分钟1.595秒)

由Sphinx-Gallery生成的图库