频率域滤波图像复原的python实现——数字图像处理

原理

维纳滤波的原理是基于统计方法,旨在通过最小化信号的估计误差来改善信号的质量。它在处理具有噪声干扰的信号时特别有效。维纳滤波旨在从受噪声干扰的信号中恢复原始信号。它假设信号和噪声都是随机过程,并且它们的统计特性是已知的或可估计的。维纳滤波器的设计基于最小化输出和所需信号之间的均方误差(MSE)。

数学原理
假设 x(n) 是原始信号,d(n) 是观测到的受噪声干扰的信号,y(n) 是滤波器的输出。那么,噪声 v(n) 可以表示为:
在这里插入图片描述
维纳滤波器的目标是找到一个滤波器 h(n),使得输出 y(n) 尽可能接近原始信号 x(n)。这可以通过最小化均方误差来实现:
在这里插入图片描述
在频域中,维纳滤波器的频率响应 H(f) 可以表示为:
在这里插入图片描述

实际应用
在实际应用中,信号和噪声的统计特性可能不完全已知,因此需要估计这些特性。维纳滤波器可以是固定的,也可以是自适应的,自适应滤波器会根据输入信号的变化动态调整其参数。维纳滤波在信号处理、图像处理、通信等领域有广泛的应用,特别是在需要从噪声中恢复信号的场合。

python实现下图

在这里插入图片描述

提示

这是一幅经过参数k=0.0025的大气湍流模型退化后的图像。结果图中的第一行是经大气湍流模型退化后的图像在逆滤波和维纳滤波后的结果:逆滤波参数和上个实验一样,限制滤波频率是通过对比值G(u,v)/H(u,v)应用一个阶数为10,截止频率为60的巴特沃斯低通函数来实现的;参数K取0.01。通过观察结果可以发现在只有退化函数作用时,逆滤波和维纳滤波的效果相差不大。结果图中第二行的基础上叠加均值为0,方差为0.01的高斯噪声形成的(可以用skimage.util.random_noise函数添加噪声),对其进行逆滤波的参数仍和上一步一样,阶数为10,截止频率为60;而维纳滤波的参数K取0.2。通过比较结果,可以看出在叠加噪声的情况下,逆滤波难以得到理想结果,而维纳滤波通过交互式地选取参数K可以较好地滤除噪声的干扰。大家可以尝试K的不同参数值,观察维纳滤波结果的表现。

python代码

import cv2
import numpy as np
import skimage
from matplotlib import pyplot as plt

img = cv2.imread('Fig0525.tif', 0)
img_n = skimage.util.random_noise(img, mode='gaussian', seed=None, clip=False, mean=0, var=0.01)
img_n = 255*(img_n-img_n.min())/(img_n.max()-img_n.min())
img_n = img_n.astype(np.uint8)
img_original_list = [img, img_n]
img_name_list = ['original', 'inverse', 'wiener']

rows = img.shape[0]
cols = img.shape[1]

Cx = rows//2
Cy = cols//2

# 大气湍流模型的参数
k = 0.0025

# 构造退化函数
H = np.zeros((rows, cols))
for x in range(rows):
    for y in range(cols):
        D = ((x - Cx) ** 2 + (y - Cy) ** 2) ** (5/6)
        H[x, y] = np.exp(-k * D)

# 根据上一个实验得出的截止频率,构造巴特沃斯低通滤波器
D0 = 60
n = 10
HB = np.zeros((rows, cols))
for x in range(rows):
    for y in range(cols):
        D = np.sqrt((x-Cx)**2 + (y-Cy)**2)
        HB[x, y] = 1 / (1 + (D/D0)**(2*n))

# 维纳滤波的参数
K = [0.01, 0.2]

img_inverse_list = []
img_wiener_list = []
for idx, img in enumerate(img_original_list):
    dft = np.fft.fft2(img)
    dft_shift = np.fft.fftshift(dft)
    # 逆滤波
    dft_filtered = np.multiply(np.multiply(dft_shift, 1/H), HB)
    img_result = np.abs(np.fft.ifft2(np.fft.fftshift(dft_filtered)))
    img_inverse_list.append(img_result)
    # 维纳滤波
    K_ = K[idx]
    HW = np.conj(H) / ((np.abs(H) ** 2)+K_)
    dft_filtered = np.multiply(dft_shift, HW)
    img_result = np.abs(np.fft.ifft2(np.fft.fftshift(dft_filtered)))
    img_wiener_list.append(img_result)

_, axs = plt.subplots(2, 3)

for i in range(2):
    axs[i, 0].imshow(img_original_list[i], cmap='gray')
    axs[i, 0].set_title(img_name_list[0])
    axs[i, 0].axis('off')
    axs[i, 1].imshow(img_inverse_list[i], cmap='gray')
    axs[i, 1].set_title(img_name_list[1])
    axs[i, 1].axis('off')
    axs[i, 2].imshow(img_wiener_list[i], cmap='gray')
    axs[i, 2].set_title(img_name_list[2])
    axs[i, 2].axis('off')

#plt.savefig('wiener_filter.jpg')
plt.show()

结果展示

在这里插入图片描述

K=0.025
在这里插入图片描述

讨论

维纳滤波是美国应用数学家诺伯特·维纳(Norbert Wiener)在二十世纪四十年代提出的一种滤波器,并在1949年出版.
维纳滤波器(Wiener filter)是由数学家维纳(Norbert Wiener)提出的一种以最小平方为最优准则的线性滤波器。在一定的约束条件下,其输出与一给定函数(通常称为期望输出)的差的平方达到最小,通过数学运算最终可变为一个托布利兹方程的求解问题。维纳滤波器又被称为最小二乘滤波器或最小平方滤波器,目前是基本的滤波方法之一。维纳滤波是利用平稳随机过程的相关特性和频谱特性对混有噪声的信号进行滤波的方法,1942年美国科学家N.维纳为解决对空射击的控制问题所建立,是40年代在线性滤波理论方面所取得的最重要的成果。
维纳滤波器的优点是适应面较广,无论平稳随机过程是连续的还是离散的,是标量的还是向量的,都可应用。对某些问题,还可求出滤波器传递函数的显式解,并进而采用由简单的物理元件组成的网络构成维纳滤波器。维纳滤波器的缺点是,要求得到半无限时间区间内的全部观察数据的条件很难满足,同时它也不能用于噪声为非平稳的随机过程的情况,对于向量情况应用也不方便。因此,维纳滤波在实际问题中应用不多。实现维纳滤波的要求是:①输入过程是广义平稳的;②输入过程的统计特性是已知的。根据其他最佳准则的滤波器亦有同样要求。然而,由于输入过程取决于外界的信号、干扰环境,这种环境的统计特性常常是未知的、变化的,因而难以满足上述两个要求。这就促使人们研究自适应滤波器。
经过改变参数k,可以看出在叠加噪声的情况下,逆滤波难以得到理想结果,而维纳滤波通过交互式地选取参数K可以较好地滤除噪声的干扰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/301044.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据仓库与联机分析处理】数据仓库工具Hive

目录 一、Hive简介 (一)什么是Hive (二)优缺点 (三)Hive架构原理 (四)Hive 和数据库比较 二、MySQL的安装配置 三、Hive的安装配置 1、下载安装包 2、解压并改名 3、配置环…

Dockerfile的ENV

文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息,可以直接看结果: 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…

崩坏:星穹铁道「V1.5攻略」绥园新增隐藏任务攻略-巡镝篇

这里是闲游盒小盒子,本期为大家带来的是1.5版本绥园地图内的隐藏任务攻略,希望能对各位开拓者有帮助。 01.小鬼心愿(赞许*1) 与青丘台入口旁的小鬼对话接取任务,带它去任务目标点即可。 02.眼一直闭(成就*…

Devtools热部署

1.添加Devtools jra <groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>2.添加plugin插件 <build><…

K8S--持久卷(PersistentVolume)的用法

原文网址&#xff1a;K8S--持久卷(PersistentVolume)的用法-CSDN博客 简介 本文介绍K8S的持久卷(PersistentVolume)的用法。 目标&#xff1a;用持久卷的方式将主机的磁盘与容器磁盘映射&#xff0c;安装nginx并运行。 --------------------------------------------------…

关于对象存储的若干事

引言 最近在阅读鸣嵩的一篇文章&#xff0c;数据库的下一场革命&#xff1a;S3 延迟已降至原先的 10%&#xff0c;云数据库架构该进化了 收获很多&#xff0c;过去时间也基于对象存储做过一些功能实现&#xff0c;特记录下。关于鸣嵩&#xff1a; 曹伟&#xff0c;花名鸣嵩&am…

MySQL视图 索引 面试题

一. 视图 视图&#xff1a;一种虚拟存在的表&#xff0c;行和列的数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的&#xff0c;只保存了sql逻辑&#xff0c;不保存查询结果 视图语法 -- 创建 create view 视图名 as 查询语句;-- 使用 select * f…

大数据 Yarn - 资源调度框架

Hadoop主要是由三部分组成&#xff0c;除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce&#xff0c;还有一个是分布式集群资源调度框架Yarn。 但是Yarn并不是随Hadoop的推出一开始就有的&#xff0c;Yarn作为分布式集群的资源调度框架&#xff0c;它的出现伴随着…

Cache伪共享

伪共享 什么是伪共享 为了解决计算机系统中主内存与CPU之间运行速度差问题&#xff0c;会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。 这个Cache一般是被集成到CPU内部的&#xff0c;所以也叫CPU Cache。 在Cache内部是按行存储的&#xff0c;其中每一行称为…

springboot 房屋租赁系统

spring boot mysql mybatis 前台后端

【二】使用create-vue创建vue3的helloworld项目(推荐)

create-vue 官网&#xff1a;快速上手 | Vue.js create-vue 是 Vue3 的专用脚手架&#xff0c;使用 vite 创建 Vue3 的项目&#xff0c;也可以选择安装需要的各种插件&#xff0c;使用更简单。 1、使用方式 npm create vuelatest这个命令会安装和执行 create-vue&#xff0…

位运算--二进制中1的个数(含常见的二进制运算操作)

目录 二进制中1的个数操作 1 查看第k位的数字是否为1操作2 lowbit操作 解题代码&#xff1a; 原题链接: 二进制中1的个数 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 1 的个数。 输入格式 第一行包含整数 n 。 第二行包含 n 个整数&#xff0c…

聚道云软件连接器助力某新能源行业公司实现付款流程自动化

客户介绍&#xff1a; 某新能源行业公司是一家集研发、生产、销售新能源汽车于一体的综合性新能源企业。公司业务遍及全球多个国家和地区&#xff0c;拥有庞大的供应商网络和采购需求。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#xf…

Unity中Shader面片一直面向摄像机

文章目录 前言一、实现思路1、 我们要实现模型面片一直跟着摄像机旋转&#xff0c;那么就需要用到旋转矩阵2、确定 原坐标系 和 目标坐标系3、确定旋转后坐标系基向量 二、确定旋转后 坐标系基向量 在 原坐标系 下的值1、Z轴基向量2、假设Y轴基向量 和 世界空间下 的Y轴方向一致…

科学的摇篮 - 贝尔实验室

AT&T贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;是美国电信公司AT&T的研究与开发部门&#xff0c;成立于1925年。它在20世纪的许多年里一直是科学与技术创新的重要中心&#xff0c;做出了众多重大贡献&#xff0c;并为多项科技成就奠定了基础。以下…

ReentrantLock底层原理学习二

以 ReentrantLock 作为切入点&#xff0c;来看看在这个场景中是如何使用 AQS 来实现线程的同步的 ReentrantLock 的时序图 调用 ReentrantLock 中的 lock()方法&#xff0c;源码的调用过程我使用了时序图来展现。ReentrantLock.lock() 这个是 reentrantLock 获取锁的入口 pu…

C++流媒体服务器 ZLMediaKit框架ZLToolKit源码解读

ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 ZLMediaKit开源地址&#xff1a;https://github.com/ZLMedi…

SpringMVC-@RequestMapping注解

0. 多个方法对应同一个请求 RequestMapping("/")public String toIndex(){return "index";}RequestMapping("/")public String toIndex2(){return "index";}这种情况是不允许的&#xff0c;会报错。 1. 注解的功能 RequestMapping注…

C++面试宝典第15题:最长回文子串

题目 回文是一个正读和反读都相同的字符串,比如:"aba"是回文,而"abc"不是回文。现给定一个字符串s,找出s中最长的回文子串(可能有多个最长的,找出一个即可)。 示例 1: 输入: "babad" 输出: "bab"("aba" 也是一个有…

总420+,专业120+南京大学851信号与系统电子信息考研经验通信,电子信息

今年考研数学130&#xff0c;专业课120&#xff0c;总分420顺利被南京大学电通录取&#xff0c;梦圆南大&#xff0c;这一年的复习有过迷茫&#xff0c;有过犹豫&#xff0c;最后都坚持过来了&#xff0c;总结一下自己的复习经验&#xff0c;希望对大家有所帮助。数学 5-8月数…