使用高斯滤波器去除椒盐噪声

602 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

前言

在本节中,我们将学习如何使用频域中的低通滤波器( LPF )从图像中删除脉冲噪声( impulse noise,也称椒盐噪声)。为了完成此目标,我们将使用 scipy.fftpack 模块的 fft2() 函数计算图像的功率谱,然后使用高斯 LPF 去除噪声(噪声通常与图像中的高频分量相对应)。

使用高斯滤波器去除椒盐噪声

(1) 首先,导入所需的 Python 库:

import numpy as np
from skimage.io import imread
from skimage.color import rgb2gray
import matplotlib.pyplot as plt
from scipy import ndimage
from scipy import fftpack
from skimage.util import random_noise

(2) 读取输入图像,将其转换为灰度图像,然后使用图像添加随机脉冲噪声,以获得带有噪声的图像,用于后续处理。我们使用 skimage.util 模块的 random_noise() 函数生成随机噪声:

skimage.util.random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs)

random_noise() 函数用于将各种不同类型的随机噪声添加到浮点类型的输入图像 image 中。

# 读取输入图像并转换为灰度图像
im = rgb2gray(imread('1.png'))
noisy = random_noise(im, mode='s&p')

(3) 接下来,计算带有噪声图像的 DFT,并在频域中使用标准偏差 σσ 应用高斯 LPF,然后执行 IDFT,以获得平滑图像。scipy.ndimage 模块的 fourier_gaussian() 函数用于在频域中应用高斯 LPF,此函数的调用方式如下:

scipy.ndimage.fourier.fourier_gaussian(input, sigma, n=-1, axis=-1, output=None)

调用 fourier_gaussian() 函数应用高斯 LPF

im_freq = fftpack.fft2(im)
noisy_freq = fftpack.fft2(noisy)
sigma = 1 # 0.1
noisy_smoothed_freq = ndimage.fourier_gaussian(noisy_freq, sigma=sigma)
noisy_smoothed = fftpack.ifft2(noisy_smoothed_freq)

(4) 接下来,绘制所有图像以及功率谱:

fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6)) = plt.subplots(3, 2, figsize=(20,20))
plt.gray()  # 在灰度空间中显示处理结果
ax1.imshow(im), ax1.axis('off'), ax1.set_title('Original Image', size=10)
ax2.imshow((20*np.log10(0.1 + fftpack.fftshift(im_freq))).real.astype(int))
ax2.set_title('Original Image (Freq Spec)', size=10)
ax3.imshow(noisy), ax3.axis('off'), ax3.set_title('Noisy Image', size=10)
ax4.imshow((20*np.log10( 0.1 + fftpack.fftshift(noisy_freq))).real.astype(int))
ax4.set_title('Noisy Image (Freq Spec)', size=10)
ax5.imshow(noisy_smoothed.real), ax5.axis('off'), ax5.set_title('Output Image (with LPF)', size=10)
ax6.imshow( (20*np.log10( 0.1 + fftpack.fftshift(noisy_smoothed_freq))).real.astype(int))
ax6.set_title('Output Image (Freq Spec)', size=10)
plt.tight_layout()
plt.show()

Figure_9.png

从以上结果图像可以看出,大多数椒盐噪声(图像中的异常白/黑点)可以使用高斯 LPF 去除,高斯滤波器可以过滤掉与噪声相对应的高频,但同时这也会导致图像中一些细节的丢失。