使用LPF/Notch滤波器执行图像去噪

  • 0. 前言
  • 1. 使用 Notch 滤波器去除图像周期性噪声
  • 2. 使用高斯滤波器去除椒盐噪声
  • 相关链接

0. 前言

在本节中,我们将学习如何使用频域滤波器(例如高斯低通滤波器和 Notch 滤波器)从输入图像中删除噪声。我们将首先使用 Notch 滤波器删除周期性噪声,然后介绍如何使用例如高斯滤波器等低通滤波器 (Low Pass Filter, LPF) 输出图像中的脉冲噪声。

1. 使用 Notch 滤波器去除图像周期性噪声

Notch 滤波器,也称为带阻滤波器( band-stop/band-reject filter),由于该滤波器会阻挡/抑制图像中一些特定的频域表示而得名,它对于从图像中去除周期性噪声( periodic noise )非常有用。在本节中,我们将介绍如何使用 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 pltim_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 滤波器过滤这两个频率可以删除图像中的周期性噪声。

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

在本节中,我们将学习如何使用频域中的低通滤波器( 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()


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

相关链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【7】采样、卷积与离散傅里叶变换

[Python图像处理] 使用LPF/Notch滤波器执行图像去噪相关推荐

  1. [Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  2. 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  4. 图像处理/计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

    计算机视觉滤波器实操 基础知识 一. 计算机视觉技术中常见的几种滤波器 二.滤波器相关知识 应用一:算术均值.几何均值.谐波逆谐波 一.问题分析 二.结果图 三.代码附录 应用二:维纳滤波,逆滤波 一 ...

  5. 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)

    4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 文章目录 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 1 算 ...

  6. Python 图像处理实用指南:1~5

    原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

  7. 《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  8. python 图像处理

    转自: 点击打开链接 第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像.图像转换和缩放.计算导数.画图和保 ...

  9. python图像切面numpy_十个Python图像处理工具,不可不知!

    原标题:十个Python图像处理工具,不可不知! 这些Python库提供了一种简单直观的方法来转换图像并理解底层数据. 今天的世界充满了数据,图像是这些数据的重要组成部分.但是,在使用它们之前,必须对 ...

最新文章

  1. php多线程foreach,php中foreach curl实现多线程例子
  2. 样机模型尺寸怎么改_土耳其五代机全尺寸样机模型首次亮相巴黎航展,这不是玩票,是一架认真设计的五代机!...
  3. ORACLE 内置函数之 GREATEST 和 LEAST(转)
  4. 点乘和叉乘的区别_关于延时和混响的区别与专用延时器与混响器的调控技巧
  5. 邻接矩阵和邻接表_[力扣743] 带权邻接表的单源最短路
  6. dbcp释放不了mysql链接_spring dbcp连接不释放-问答-阿里云开发者社区-阿里云
  7. 随想录(项目管理中的感受)
  8. 服务器磁盘性能表现在,09计算机等级考试试题.doc
  9. python做数据分析的包_Python数据分析包的学习
  10. 【图像分割】基于matlab粒子群优化T熵图像分割【含Matlab源码 286期】
  11. 计算机格式化为ntfs,u盘无法格式化成ntfs怎么办解决教程
  12. 知识图谱概述(金融场景图谱)
  13. ubuntu翻译软件安装
  14. 一杯咖啡带你读懂状态机
  15. python tkinter ttk_关于tkinter和ttk的新教程,适用于Python 3
  16. 关于溢出标志OF和进/借位标志CF的判断
  17. 全国 2020 NOIP试题 微信步数(walk)
  18. jmeter 聚合报告里面是什么意思
  19. Amino——用户反馈
  20. Python 城市分类

热门文章

  1. recv_contxt = std::string( (char*)recv_buffer+sizeof(Req),pReq->context_len-86);
  2. Android扫描条形码与二维码
  3. pip install 太慢,迅雷来帮忙
  4. Solr 之 Linux 安装 solr-8.10.1
  5. HTML 关于hr标签,虚线
  6. 蓝海卓越三层漫游解决方案
  7. govcl html5,GoVCL —— Go 语言开发的 UI 组件库 | 软件推介
  8. 【深搜】小孩分油问题
  9. uni-app关于uni.setStorageSync和uni.setStorage踩坑
  10. Python爬取bilibili番剧排行