注意
转到结尾 下载完整的示例代码。或通过Binder在浏览器中运行此示例
将灰度滤波器应用于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)")
Text(0.5, 1.0, 'Sobel filter computed\n on (V)alue converted image (HSV)')
请注意,值过滤图像的结果保留了原始图像的颜色,但通道过滤图像以更意外的方式组合。在其他常见情况下,例如平滑,通道过滤图像将产生比值过滤图像更好的结果。
您还可以为adapt_rgb
创建自己的处理程序函数。为此,只需创建一个具有以下签名的函数:
请注意,adapt_rgb
处理程序是为图像作为第一个参数的滤波器编写的。
作为一个非常简单的例子,我们可以将任何RGB图像转换为灰度,然后返回过滤后的结果
重要的是创建一个使用*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()
注意
一个非常简单的数组形状检查用于检测RGB图像,因此adapt_rgb
不建议用于支持3D体积或非RGB空间中的彩色图像的函数。
脚本的总运行时间:(0分钟1.595秒)