开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
前言
Notch 滤波器,也称为带阻滤波器( band-stop/band-reject filter),由于该滤波器会阻挡/抑制图像中一些特定的频域表示而得名,它对于从图像中去除周期性噪声( periodic noise )非常有用。在本节中,我们将介绍如何使用 Notch 滤波器从图像中去除周期性噪声。
使用 Notch 滤波器去除图像周期性噪声
在本节中,我们将使用带有周期性噪声的输入图像,并尝试利用 numpy.fft 模块中的 fft2() 函数去除输入图像中的周期性噪声。
(1) 首先,导入所需 Python 库并读取输入图像,然后将其转换为灰度图像,使用 numpy.fft.fft2() 函数通过使用以下代码块:
import numpy as np
import numpy.fft as fp
from skimage.io import imread
from skimage.color import rgb2gray
import matplotlib.pyplot as plt
im_noisy = rgb2gray(imread("2.jpg"))
F_noisy = fp.fft2((im_noisy))
print(F_noisy.shape)
(2) 为了找出功率谱的频率,我们需要搜索功率谱中的异常亮点。因此,我们需要将功率谱绘制于带有标尺的坐标系中,为此我们需要编写 plot_freq_spectrum() 函数以查找这些异常亮点:
def plot_image(im, title):
plt.imshow(im, cmap='gray')
plt.axis('off')
plt.title(title, size=10)
def plot_freq_spectrum(F, title, cmap=plt.cm.gray):
plt.imshow((20*np.log10(0.1 + fp.fftshift(F))).real.astype(int), cmap=cmap)
plt.xticks(np.arange(0, im_noisy.shape[1], 25))
plt.yticks(np.arange(0, im_noisy.shape[0], 25))
plt.title(title, size=10)
(3) 接下来,绘制原始带有周期性噪声的图像及其功率谱:
plt.figure(figsize=(20,10))
plt.subplot(121), plot_image(im_noisy, 'Noisy Input Image')
plt.subplot(122), plot_freq_spectrum(F_noisy, 'Noisy Image Spectrum')
plt.tight_layout()
plt.show()
从上图中,可以观察到功率谱图像中心处有两个异常的明亮斑点,这可能导致噪声被放大。
(4) 接下来,我们过滤这两个频率(将相应的系数设置为 0),然后将修改后的频谱转换回空域中,以检查是否能够删除周期性噪声:
F_noisy_shifted = fp.fftshift(F_noisy)
F_noisy_shifted[180,210] = F_noisy_shifted[200,190] = 0
im_out = fp.ifft2(fp.ifftshift(F_noisy_shifted)).real
(5) 绘制处理后的输出图像,查看是否能够恢复未被噪声污染的图像:
plt.figure(figsize=(10,8))
plot_image(im_out, 'Output Image')
plt.show()
从以上输出图像中可以看出,通过利用 Notch 滤波器过滤这两个频率可以删除图像中的周期性噪声。