当前位置: 首页 > news >正文

【计算机视觉】超简单!维纳滤波的经典案例

Hey小伙伴们!今天来给大家分享一个 计算机视觉 中非常经典且实用的技术——维纳滤波(Wiener Filter)。维纳滤波是一种基于最小均方误差准则的滤波方法,广泛应用于图像去噪、模糊恢复等领域。它不仅可以有效去除图像中的噪声,还能在一定程度上恢复被模糊的图像细节。

如果你对计算机视觉感兴趣,或者想学习如何用 Python 实现维纳滤波,那这篇笔记一定要收藏哦!🚀


👉 什么是维纳滤波?

维纳滤波是一种最优滤波器,它通过最小化均方误差(MSE),在已知噪声和原始信号统计特性的情况下,尽可能地恢复出原始信号。在图像处理中,维纳滤波可以用于去除加性噪声、恢复模糊图像等任务。

  • 为什么选择维纳滤波?
    • 维纳滤波不仅能够去除噪声,还能在一定程度上保留图像的细节,避免过度平滑。
    • 与其他滤波器相比,维纳滤波更加灵活,因为它可以根据噪声和图像的统计特性进行自适应调整。

👉 维纳滤波的应用场景
  1. 图像去噪:维纳滤波可以有效去除图像中的加性噪声,如高斯噪声、椒盐噪声等,同时尽量保留图像的边缘和细节。
  2. 模糊恢复:当图像受到运动模糊或镜头模糊的影响时,维纳滤波可以帮助我们恢复出更清晰的图像。
  3. 医学图像处理:在医学图像中,维纳滤波常用于去除噪声并增强图像的对比度,帮助医生更准确地诊断病情。

👉 案例场景:图像去噪与模糊恢复

我们来实现一个经典的案例:使用维纳滤波对图像进行去噪和模糊恢复。我们将使用 Python 的 scipyopencv 库来处理图像,并展示如何通过维纳滤波实现这些操作。


👉 代码实现
1. 安装依赖库

首先,确保你已经安装了以下依赖库:

pip install numpy opencv-python scipy matplotlib
2. 加载并预处理图像

我们将使用一张带有噪声和模糊的图像作为示例。你可以从网上下载一张图片,或者使用 OpenCV 自带的测试图像。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import wiener, convolve2d
from scipy import ndimage, fftpack# 读取图像(灰度图像)
image = cv2.imread('noisy_blurry.jpeg', cv2.IMREAD_GRAYSCALE)# 显示原始图像
plt.figure(figsize=(8, 6))
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.show()
3. 执行维纳滤波去噪

使用 scipy.signal.wiener 函数对图像进行维纳滤波去噪。该函数会根据图像的局部统计特性,自动调整滤波器的参数,以达到最佳的去噪效果。

np.random.seed(0)
noisy_image = image + 0.4 * image.std() * np.random.standard_normal(image.shape)fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(8, 5))
ax[0].imshow(noisy_image, cmap="gray")
ax[0].set_title("Noisy Image")psf = np.ones((5, 5)) / 25
blurred_noisy_image = convolve2d(noisy_image, psf, 'same', boundary='symm')ax[1].imshow(blurred_noisy_image, cmap="gray")
ax[1].set_title("Blurred Noisy Image")
plt.tight_layout()
plt.show()# 执行维纳滤波去噪
filtered_image = wiener(blurred_noisy_image, (3, 3))  # (5, 5) 是滤波窗口大小
4. 添加模糊效果(可选)

为了演示维纳滤波的模糊恢复能力,我们可以先给图像添加一些模糊效果。这里我们使用高斯模糊来模拟常见的模糊现象。

# 添加高斯模糊
blurred_image = ndimage.gaussian_filter(image, sigma=(5, 5))# 显示模糊后的图像
plt.figure(figsize=(8, 6))
plt.imshow(blurred_image, cmap='gray')
plt.title('gauss blurred image')
plt.axis('off')
plt.show()
5. 执行维纳滤波模糊恢复

接下来,我们使用维纳滤波对模糊图像进行恢复。维纳滤波不仅可以去除噪声,还能在一定程度上恢复模糊的图像细节。

def wiener_filter(image, kernel, K=0.25):# 计算傅里叶变换image_fft = fftpack.fftshift(fftpack.fftn(image))kernel_fft = fftpack.fftshift(fftpack.fftn(kernel, shape=image.shape))# 构建Wiener滤波器传递函数H_conj = np.conjugate(kernel_fft)numerator = H_conj * abs(kernel_fft)**2 / (abs(kernel_fft)**2 + K)# 应用Wiener滤波restored_image_fft = image_fft * numeratorrestored_image = np.real(fftpack.ifftn(fftpack.ifftshift(restored_image_fft)))return restored_imagepsf = np.outer(np.exp(-(np.arange(-5, 6)**2)/10), np.exp(-(np.arange(-5, 6)**2)/10))
# 执行维纳滤波模糊恢复
restored_image = wiener_filter(blurred_image, psf)# 显示恢复后的图像
plt.figure(figsize=(8, 6))
plt.imshow(restored_image, cmap='gray')
plt.title('restored image')
plt.axis('off')
plt.show()
6. 比较不同处理结果

为了更直观地对比不同处理的效果,我们可以将原始图像、去噪后的图像、模糊后的图像和恢复后的图像放在一起展示。

# 创建一个包含所有图像的子图
fig, axes = plt.subplots(1, 4, figsize=(20, 6))# 原始图像
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original')
axes[0].axis('off')# 去噪后的图像
axes[1].imshow(filtered_image, cmap='gray')
axes[1].set_title('filtered_image')
axes[1].axis('off')# 模糊后的图像
axes[2].imshow(blurred_image, cmap='gray')
axes[2].set_title('gauss noisy image')
axes[2].axis('off')# 恢复后的图像
axes[3].imshow(restored_image, cmap='gray')
axes[3].set_title('restored image')
axes[3].axis('off')# 显示所有图像
plt.show()

👉 关键点解析
  1. 维纳滤波的工作原理

    • 维纳滤波通过最小化均方误差(MSE),在已知噪声和原始信号统计特性的情况下,尽可能地恢复出原始信号。
    • 它可以根据图像的局部统计特性,自动调整滤波器的参数,以达到最佳的去噪和恢复效果。
  2. 滤波窗口大小

    • wiener 函数中,kernel 参数指定了滤波窗口的大小。较大的窗口可以更好地去除噪声,但可能会导致图像细节的丢失;较小的窗口则可以保留更多的细节,但去噪效果可能不如较大窗口。
    • 你可以根据具体需求调整窗口大小,找到最佳的平衡点。
  3. 模糊恢复

    • 维纳滤波不仅可以去除噪声,还能在一定程度上恢复模糊的图像细节。通过合理设置滤波窗口大小,可以在去噪的同时恢复出较为清晰的图像。
  4. 自适应性

    • 维纳滤波具有一定的自适应性,能够根据图像的不同区域动态调整滤波器的参数。这使得它在处理复杂图像时表现出色,尤其适用于噪声和模糊程度不均匀的图像。

运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从结果上看在添加高斯模糊后恢复的图像上,可以进一步提升恢复的质量。

👉 更多扩展
  1. 结合其他滤波器:维纳滤波可以与其他滤波器(如高斯滤波、中值滤波)结合使用,进一步提升去噪效果。例如,在去噪之前可以先使用高斯滤波平滑图像,然后再应用维纳滤波进行精细处理。

  2. 多尺度分析:结合小波变换(Wavelet Transform),可以在多个尺度上分析图像的频率特性,进一步提升去噪和模糊恢复的效果。

  3. 自定义噪声模型:如果已知噪声的具体分布(如高斯噪声、泊松噪声等),可以为维纳滤波提供更精确的噪声模型,从而获得更好的恢复效果。

  4. 深度学习结合:近年来,深度学习在图像去噪和模糊恢复领域取得了显著进展。你可以尝试将维纳滤波与卷积神经网络(CNN)结合,利用深度学习的强大表征能力,进一步提升图像处理的效果。


👉 总结与应用

通过这个简单的图像去噪与模糊恢复案例,我们可以看到维纳滤波在计算机视觉中的强大功能。它不仅可以有效去除图像中的噪声,还能在一定程度上恢复模糊的图像细节。维纳滤波是图像处理中非常重要的一项技术,广泛应用于图像去噪、模糊恢复、医学图像处理等领域。

希望这篇笔记能帮助大家更好地理解和应用维纳滤波!如果你觉得有用,别忘了点赞、收藏哦!如果有任何问题或想法,欢迎在评论区留言交流,我们一起学习进步!💖


👉 更多资源
  • SciPy 官方文档
  • OpenCV 官方文档
  • Matplotlib 官方文档

🌟 结语

今天的分享就到这里啦!希望这篇笔记能帮助大家更好地理解和应用维纳滤波。如果你觉得有用,别忘了点赞、收藏哦!如果有任何问题或想法,欢迎在评论区留言交流,喜欢我的朋友请点赞,收藏并关注我,我们一起学习进步!💖

相关文章:

【计算机视觉】超简单!维纳滤波的经典案例

Hey小伙伴们!今天来给大家分享一个 计算机视觉 中非常经典且实用的技术——维纳滤波(Wiener Filter)。维纳滤波是一种基于最小均方误差准则的滤波方法,广泛应用于图像去噪、模糊恢复等领域。它不仅可以有效去除图像中的噪声&#…...

【closerAI ComfyUI】快速洗图!高效快速的提示词反推节点——cliption,让洗图出图快人一步不爆显存!

添加图片注释,不超过 140 字(可选) 【closerAI ComfyUI】快速洗图!高效快速的提示词反推节点——cliption,让洗图出图快人一步不爆显存! 大家好,我是Jimmy。反推提示词的节点有很多,像Florence2 、Joycaption2、喵手等。都是非常优秀的。但是呢,就是占用设备资源,加…...

AE Dressler CESAR 1312 Generator Model User Manual

AE Dressler CESAR 1312 Generator Model User Manual...

【513. 找树左下角的值 中等】

题目: 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 提示: 二叉树的节点个数的范围是 …...

网络通信的瑞士军刀:Python socket库全解析

文章目录 网络通信的瑞士军刀:Python socket库全解析背景库介绍安装与重要性简单库函数使用方法场景应用常见Bug及解决方案总结 网络通信的瑞士军刀:Python socket库全解析 背景 在现代编程中,网络通信是不可或缺的一部分。无论是构建客户端…...

【笔记️】魔爪 Mini mx 使用快捷键

B站教程地址:MOZA魔爪的个人空间-MOZA魔爪个人主页-哔哩哔哩视频 1、开关键: 单击 → 开启录制/拍照 → 再次单击结束;休眠时,单击晚醒 双击 → 切换拍照/录制模式 三击 → 切换横竖拍 长按 → 关机 2、变焦键: 单击 → 切换航向俯仰跟随模式 ( 开机默…...

去除 el-input 输入框的边框(element-ui@2.15.13)

dgqdgqdeMac-mini spid-admin % yarn list --pattern element-ui yarn list v1.22.22 └─ element-ui2.15.13 ✨ Done in 0.23s.dgqdgqdeMac-mini spid-admin % yarn list vue yarn list v1.22.22 warning Filtering by arguments is deprecated. Please use the pattern opt…...

Vue中的一些用法

一、验证规则: 身份证的验证规则: 电话号码的验证规则: 二、选中一项后禁用其他选项: data(){ return{ dataForm{ medicalHistory:[] } }, 三、多选框选择后页面中不显示数据: 在表单提交时加 .join(",&…...

异步爬虫之协程的基本原理

我们知道爬虫是 IO 密集型任务,例如使用 requests 库来爬取某个站点,当发出一个请求后,程序必须等待网站返回响应,才能接着运行,而在等待响应的过程中,整个爬虫程序是一直在等待的,实际上没有做…...

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)

前言 本文最开始属于此文《视频生成Sora的全面解析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中,在机器人动作预测也被运用的越来越多,加之DiT确实是一个比较大的创新,影响力大&…...

CPT203 Software Engineering 软件工程 Pt.2 敏捷方法和需求工程(中英双语)

文章目录 3. Aglie methods(敏捷方法)3.1 Aglie methods(敏捷方法)3.1.1 特点3.1.2 优点3.1.3 缺点3.1.4 原则3.1.5 计划驱动与敏捷方法的对比 3.2 Scrum3.2.1 Scrum roles3.2.2 Scrum Activities and Artifacts3.2.2.1 Product B…...

【Git】-- 在本地执行 git fetch 发生异常

目录 1、现象 2、解决参考 2.1 检查网络连接 2.2 更新 Git 客户端 2.3 更改 GitHub URL 的访问协议 2.4 禁用 SSL 验证(临时解决) 2.5 检查系统的 CA 证书 2.6 重新克隆仓库 1、现象 在本地执行 $ git fetch upstream 时,抛出以下…...

Apache Doris 创始人:何为“现代化”的数据仓库?

在 12 月 14 日的 Doris Summit Asia 2024 上,Apache Doris 创始人 & PMC 成员马如悦在开场演讲中,围绕“现代化数据仓库”这一主题,指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑,他将这一进展总结为“实时之路”、“…...

高校网络安全存在的问题与对策研究

目 录 摘 要1 第1章 引言2 1.1研究背景2 1.2研究意义2 第2章系统开发的相关技术简介3 2.1 Spring boot框架3 2.2 MySQL简介3 2.3 Vue框架3 2.4 JAVA简介3 第3章 系统需求分析4 3.1可行性分析4 3.1.1技术可行性4 3.1.2运行可行性4 3.1.3经济可行性5 3.2功能需求…...

Redis的数据类型,线程,持久化机制

1. Redis是单线程还是多线程的,为什么? Redis是单线程的(传统实现) Redis在传统的实现中是单线程的。尽管它处理的任务很多,但它使用单线程来处理所有客户端的请求。这个设计决策有几个关键原因: 简化模型…...

什么是ondelete cascade以及使用sqlite演示ondelete cascade使用案例

什么是ondelete cascade ‌ON DELETE CASCADE是数据库中的一种约束,用于自动删除相关的记录‌。具体来说,当一个表中的记录(父表)被删除时,与其相关的其他表(子表)中的记录也会被自动删除&…...

Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解

文章目录 概述结构案例实现优缺点及使用场景 概述 享元模式也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象; 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象…...

数据的简单处理——pandas模块——选择数据

要对读取的数据进行编辑,需要先学会选择数据的操作,如果选择行数据、列数据或者同时选择行列数据。 ############################## ##作者:白雪公主的后妈 ##时间:2024年12月29日 ##主题:数据的简单处理——pandas模…...

淘宝/天猫购物车商品列表API:深度解析与应用实践

引言 在电商领域,购物车功能是提升用户体验和增加销售额的关键工具。淘宝和天猫作为中国最大的电商平台,提供了丰富的API接口,其中包括获取购物车商品列表的API,即buyer_cart_list。本文将深入解析淘宝/天猫购物车商品列表API的功…...

位置式PID-控制步进电机-位置环-stm32

基本原理 1、软件设计 本闭环控制例程是在步进电机编码器测速例程的基础上编写的,这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。 我们创建了4个文件:bsp_pid.c和bsp_pid.h文件用来存放PID控制器相关程序,bsp_s…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...