计算机视觉中的中值滤波:经典案例与Python代码解析

Hey小伙伴们!今天我们要聊的是计算机视觉中的一个重要技术——中值滤波。中值滤波是一种非线性滤波方法,主要用于去除图像中的椒盐噪声,同时保留图像的边缘和细节。通过中值滤波,我们可以显著改善图像的质量。让我们一起来看看如何使用Python实现中值滤波吧!🎉


📝 理论篇:中值滤波的基本原理

中值滤波是一种非线性滤波方法,通过将滤波器窗口内的像素值排序,取中间值作为新的像素值。这种方法特别适用于去除椒盐噪声,因为它不受极端值的影响。

1. 椒盐噪声(Salt and Pepper Noise)

椒盐噪声是一种常见的图像噪声,表现为图像中随机出现的黑色和白色像素点。中值滤波可以有效地去除这种噪声。

2. 中值滤波的工作原理

假设有一个 (3 ×3)的滤波器窗口,窗口内的像素值如下:
10 20 30 40 50 60 70 80 90 \begin{matrix} 10 & 20 & 30\\ 40 & 50 & 60\\ 70 & 80 & 90\\ \end{matrix} 104070205080306090
中值滤波的步骤如下:

  1. 提取窗口内的像素值:[10, 20, 30, 40, 50, 60, 70, 80, 90]
  2. 排序:[10, 20, 30, 40, 50, 60, 70, 80, 90]
  3. 取中间值:[50]

新的像素值就是中间值 (50)。


📑 实战篇:使用Python实现中值滤波

接下来,我们通过一个具体的Python示例来实现中值滤波。我们将使用OpenCV库来处理图像,并使用NumPy进行矩阵运算。

1. 安装必要的库

首先,确保你已经安装了OpenCV和NumPy:

pip install opencv-python numpy
2. 读取和显示图像

我们先读取一张带有椒盐噪声的图像并显示它:

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_your_image_with_noise.jpg')# 显示原始图像
cv2.imshow('Original Image with Noise', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 添加椒盐噪声

为了演示中值滤波的效果,我们先给图像添加一些椒盐噪声:

def add_salt_and_pepper_noise(image, prob):output = np.copy(image)num_salt = np.ceil(prob * image.size * 0.5).astype(int)num_pepper = np.ceil(prob * image.size * 0.5).astype(int)# Add Salt noisecoords = [np.random.randint(0, i - 1, num_salt) for i in image.shape[:2]]output[coords[0], coords[1]] = 255# Add Pepper noisecoords = [np.random.randint(0, i - 1, num_pepper) for i in image.shape[:2]]output[coords[0], coords[1]] = 0return output# 添加椒盐噪声
noisy_image = add_salt_and_pepper_noise(image, 0.05)# 显示带噪声的图像
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 中值滤波

使用OpenCV的 medianBlur 函数进行中值滤波:

def median_filter(image, kernel_size=3):# 使用OpenCV的medianBlur函数进行中值滤波filtered_image = cv2.medianBlur(image, kernel_size)return filtered_image# 应用中值滤波
filtered_image = median_filter(noisy_image, kernel_size=5)# 显示滤波后的图像
cv2.imshow('Median Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 完整代码

将上述步骤整合在一起,完整的代码如下:

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_your_image_with_noise.jpg')# 显示原始图像
cv2.imshow('Original Image with Noise', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 添加椒盐噪声
def add_salt_and_pepper_noise(image, prob):output = np.copy(image)num_salt = np.ceil(prob * image.size * 0.5).astype(int)num_pepper = np.ceil(prob * image.size * 0.5).astype(int)# Add Salt noisecoords = [np.random.randint(0, i - 1, num_salt) for i in image.shape[:2]]output[coords[0], coords[1]] = 255# Add Pepper noisecoords = [np.random.randint(0, i - 1, num_pepper) for i in image.shape[:2]]output[coords[0], coords[1]] = 0return output# 添加椒盐噪声
noisy_image = add_salt_and_pepper_noise(image, 0.05)# 显示带噪声的图像
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 中值滤波
def median_filter(image, kernel_size=3):# 使用OpenCV的medianBlur函数进行中值滤波filtered_image = cv2.medianBlur(image, kernel_size)return filtered_image# 应用中值滤波
filtered_image = median_filter(noisy_image, kernel_size=5)# 显示滤波后的图像
cv2.imshow('Median Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

🌟 成功案例

当你运行这段代码时,你会看到原始图像、添加椒盐噪声后的图像以及中值滤波后的图像。中值滤波有效地去除了椒盐噪声,同时保留了图像的边缘和细节。


🌟 小贴士
  • 核大小选择:中值滤波的核大小可以根据噪声的程度和图像的分辨率进行调整。较大的核可以去除更多的噪声,但也可能模糊图像的细节。
  • 多尺度处理:结合不同大小的中值滤波器,可以在多尺度上进行图像处理,提高效果。

🚀 运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🚀 结语

通过今天的实战演练,大家已经掌握了如何使用Python和OpenCV实现中值滤波。中值滤波是计算机视觉中非常基础但重要的技术,可以应用于图像去噪、增强和分析等多个领域。如果你有任何问题或想法,欢迎留言交流。喜欢我的朋友请点赞,收藏并关注,我们下次再见!👋


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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C++练习】计算前N项自然数之和

题目: 计算前N项自然数之和 描述: 编写一个C程序,要求用户输入一个整数N,然后计算并输出从1到N(包括N)的所有自然数之和。 程序功能要求: 程序首先提示用户输入一个整数N。使用一个循环结构…

SpringBoot日志配置

Spring默认日志风格 个人感觉默认的格式还是不错的,每一列都可以对其,而且能用颜色区分,查看日志明了; 下面是他默认的 pattern的配置 %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- …

Vue3学习笔记(上)

Vue3学习笔记(上) Vue3的优势: 更容易维护: 组合式API更好的TypeScript支持 更快的速度: 重写diff算法模板编译优化更高效的组件初始化 更小的体积: 良好的TreeShaking按需引入 更优的数据响应式&#xf…

看懂本文,入门神经网络Neural Network

神经网络(Neural Network) 1.1图片 每一个图片都是三维数组,每个像素的值为0-255,如 训练集Training Dataset:“上课学的知识”,用于训练模型得到参数 验证集Validation Dataset:“课后习题”…

Zoho Books助外贸,应收账款简化管

ZohoBooks财务管理软件助外贸企业精准管理客户信息,简化跨境开票,集成支付网关自动对账,智能提醒跟进账款,提供强大报表分析功能,支持多币种和当地税法,促进财务健康与资金回笼。 一、精准的客户信息管理 …

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器,但是不知道怎么拿来写代码,跑深度学习项目。确实,玩深度学习的成本比较高,无论是前期的学习成本,还是你需要具备的硬件成本,都是拦路虎。小罗没有办法…

作业调度和程序装入内存

作业调度 我们知道,磁盘上的可执行程序只有装入内存,成为进程才可以运行。在磁盘上有许多的可执行程序等待被操作系统唤入内存执行,我们把可执行程序在磁盘上的调度称之为作业调度。 注意:这种说法听起来好像是作业在磁盘上的调…

广义布里渊区方程推导过程中一个公式的理解

是对DOI: 10.1103/PhysRevLett.123.066404补充材料公式(S25)的理解 clear;clc;close all q2; N1;Mq*N; syms LMatsym(zeros(2*M,2*M));for ii1:MTp[];for jj1:2*M%eval([syms , f,num2str(ii),num2str(jj)]);eval([syms ,f,num2str(ii),_beta,num2str(jj),_ES])%eval([temp,f,…

嵌入式linux中HDMI驱动操作方法

大家好,今天主要给大家分享一下,linux系统里面的HDMI驱动实现方法。 第一:HDMI基本简介 HDMI 全称为 High Definition Multimedia Interface,也就是高清多媒体接口,是一个纯数字的音视频传输接口,通过一根线同时发送音视频数据。目前在电视、显示器、电脑、机顶盒等领域得…

边缘的检测

边缘检测效果,是一种用于突出图像中的边缘,使物体的轮廓更加明显的图像处理技术,边缘检测的主要目的是找到图像中亮度变化显著的区域,这些区域通常对应于物体的边界,边缘检测相当于利用 Shader 代码自动给屏幕图像进行…

架构篇(05理解架构的服务演化)

目录 学习前言 一、服务演化简介 二、方向一:架构服务化 单体分层架构 面向服务架构 - SOA 微服务架构 - Microservices 云原生架构 - Cloud Native 三、方向二:部署容器编排化 虚拟机 容器 Kubernetes 与编排 四、参考文献 学习前言 Kubern…

娶老婆花了30万彩礼,结婚2个月,她前夫给我20万,让我老婆和他生孩子!

我叫李志强,今年32岁,在一家物流公司当经理。去年我娶了我老婆张美玲,为了这场婚礼,我花了30万彩礼。美玲比我小3岁,是个护士,长得漂亮又温柔,我觉得自己找到了真爱。 结婚前,美玲就…

基于SpringBoot的国风服装商城系统+LW示例参考

1.项目介绍 系统角色:管理员、普通用户功能模块:管理员(用户管理、商品管理、分类管理、订单管理、系统管理、在线客服等),普通用户(登录注册、个人中心、评价管理、收藏管理、订单管理等、咨询服务等&…

GB/T 43206—2023信息安全技术信息系统密码应用测评要求(五)

文章目录 附录AA.1 概述A.2 密钥产生A.3 密钥分发A.4 密钥存储A.5 密钥使用A.6 密钥更新A.7 密钥归档A. 8 密钥撤销A.9 密钥备份A.10 密钥恢复A.11 密钥销毁 附录B附录C 附录A A.1 概述 密钥管理对于保证密钥全生存周期的安全性至关重要 ,可以保证密钥(除公开密钥外) 不被非授…

jmeter常用配置元件介绍总结之前置处理器、测试片段

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之前置处理器、测试片段 6.前置处理器6.1用户参数6.2取样器超时6.3.测试片段6.4JSR223 PreProcessor6.5.JDBC PreProcessor 6.前置处理器 在取样器请求之前执行的操作,优先级比取样器高,用来处理一些…

【IT人物系列】之Java之父

前言 当今世界由无数的人构成,其中有些人做了一些改变世界的事情,比如:乔布斯缔造了Apple帝国,‌詹姆斯高斯林创造了Java语言等。正是这些优秀的人做的这些优秀的事情,让这个世界更加美好。因此他们值得铭记。 从今天…

鸿蒙开发基础入门

一、熟悉目录结构 二、ArkTS语法介绍 ArkTS是为构建高性能应用设计的编程语言,语法继承TypeScript,并进行了优化,拥有更强的类型约束ArkTS提供了声明式UI范式,符合移动开发的最新趋势 ArkTS摒弃了部分影响运行时的性能的语法&…

大数据机器学习算法和计算机视觉应用01:博弈论基础

Game Theory 2-player Zero Sum GameMinimax Optimal StrategiesVon Neumann’s Minimax TheoremLower Bounds for Randomized AlgorithmsGeneral sum games, Nash quilibria (p.s:该系列是国际交流学术公开课的笔记,主讲人是Carnegie Melon University的终身教授…

如何安装和配置JDK17

教程目录 零、引言1、新特性概览2、性能优化3、安全性增强4、其他改进5、总结 一、下载安装二、环境配置三、测试验证 零、引言 JDK 17(Java Development Kit 17)是Java平台的一个重要版本,它带来了许多新特性和改进,进一步提升了…

【C++进阶】智能指针的使用及原理(1)

1. 智能指针的使用场景分析 下面程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后面的delete没有得到执行,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete…