备注
转到末尾 下载完整示例代码。或在浏览器中通过 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 分钟 0.518 秒)