开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
前言
在本节中,我们将学习使用 scipy.signal 模块的 fftconvolve() 函数,用于与 RGB 彩色输入图像进行频域卷积,从而生成 RGB 彩色模糊输出图像:
scipy.signal.fftconvolve(in1, in2, mode='full', axes=None)
函数使用 FFT 卷积两个 n 维数组 in1 和 in2,并由 mode 参数确定输出大小。
卷积模式 mode 具有以下类型:
- 输出是输入的完全离散线性卷积,默认情况下使用此种卷积模式
- 输出仅由那些不依赖零填充的元素组成,
in1或in2的尺寸必须相同 - 输出的大小与
in1相同,并以输出为中心
基于 scipy.signal 模块的彩色图像频域卷积
接下来,我们实现高斯低通滤波器并使用 Laplacian 高通滤波器执行相应操作。
(1) 首先,导入所需的包,并读取输入 RGB 图像:
from skimage import img_as_float
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
im = img_as_float(plt.imread('1.png'))
(2) 实现函数 get_gaussian_edge_kernel(),并根据此函数创建一个尺寸为 15x15 的高斯核:
def get_gaussian_edge_blur_kernel(sigma, sz=15):
# First create a 1-D Gaussian kernel
x = np.linspace(-10, 10, sz)
kernel_1d = np.exp(-x**2/sigma**2)
kernel_1d /= np.trapz(kernel_1d) # normalize the sum to 1.0
# create a 2-D Gaussian kernel from the 1-D kernel
kernel_2d = kernel_1d[:, np.newaxis] * kernel_1d[np.newaxis, :]
return kernel_2d
kernel = get_gaussian_edge_blur_kernel(sigma=10, sz=15)
(3) 然后,使用 np.newaxis 将核尺寸重塑为 15x15x1,并使用 same 模式调用函数 signal.fftconvolve():
im1 = signal.fftconvolve(im, kernel[:, :, np.newaxis], mode='same')
im1 = im1 / np.max(im1)
在以上代码中使用的 mode='same',可以强制输出形状与输入阵列形状相同,以避免边框效应。
(4) 接下来,使用 laplacian HPF 内核,并使用相同函数执行频域卷积。需要注意的是,我们可能需要缩放/裁剪输出图像以使输出值保持像素的浮点值范围 [0,1] 内:
kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]])
im2 = signal.fftconvolve(im, kernel[:, :, np.newaxis], mode='same')
im2 = im2 / np.max(im2)
im2 = np.clip(im2, 0, 1)
(5) 最后,绘制输入图像和使用卷积创建的输出图像。
plt.figure(figsize=(20,10))
plt.subplot(131), plt.imshow(im), plt.axis('off'), plt.title('original image', size=10)
plt.subplot(132), plt.imshow(im1), plt.axis('off'), plt.title('output with Gaussian LPF', size=10)
plt.subplot(133), plt.imshow(im2), plt.axis('off'), plt.title('output with Laplacian HPF', size=10)
plt.tight_layout()
plt.show()
如上图所示,高斯 LPF 可以用于模糊图像,而拉普拉斯 HPF 则可以用于提取图像中的细节/边缘(这些部分对应于图像中的高频分量)。