OpenCV--图像平滑处理
在数字图像处理领域,图像平滑处理是一项极为重要的技术,广泛应用于计算机视觉、医学影像分析、安防监控等多个领域。在 OpenCV 这一强大的计算机视觉库的助力下,我们能便捷地实现多种图像平滑算法。本文将深入探讨图像平滑的原理,结合 OpenCV 的代码示例,阐述均值滤波、高斯滤波、中值滤波和双边滤波这几种常见的平滑算法。
一、图像平滑处理简介
图像在获取或传输过程中,常受到噪声干扰,降低图像质量,影响后续分析与处理。图像平滑处理旨在通过去除噪声,改善图像质量,突出主要信息。其本质是对图像像素进行邻域操作,用邻域内像素的某种统计特征替代当前像素值。在 OpenCV 中,提供了丰富的函数和工具,帮助我们实现各类平滑算法。
二、均值滤波
1. 原理
均值滤波是最简单的图像平滑算法,它基于邻域平均的思想,以某像素邻域内所有像素的平均值替代该像素值。假设以当前像素为中心,定义一个大小为\(N\times N\)的窗口,窗口内所有像素的平均值,就是当前像素的新值。以 3x3 的窗口为例,每个像素点的新值由其周围 9 个像素(包括自身)的平均值决定。均值滤波能有效降低图像中的随机噪声,但在平滑图像的同时,可能模糊图像边缘,损失图像细节。
2. OpenCV 实现
在 OpenCV 中,使用cv2.blur()函数实现均值滤波,该函数的第一个参数为输入图像,第二个参数为内核大小。以下是一个简单的示例:
import cv2import numpy as npimport matplotlib.pyplot as plt# 读取图像img = cv2.imread('test.jpg')img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 均值滤波blurred = cv2.blur(img, (5, 5))# 显示结果plt.subplot(121), plt.imshow(img), plt.title('Original')plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(blurred), plt.title('Blurred')plt.xticks([]), plt.yticks([])plt.show()
三、高斯滤波
1. 原理
高斯滤波是一种广泛应用的线性平滑滤波,它基于高斯分布对邻域像素进行加权平均。相比均值滤波对邻域内所有像素一视同仁,高斯滤波赋予中心像素更高的权重,离中心越远的像素权重越低。高斯分布由标准差\(\sigma\)决定,\(\sigma\)越大,高斯核越宽,平滑效果越明显,但图像也越模糊。高斯滤波能在有效去除噪声的同时,较好地保留图像边缘和细节,在实际应用中表现出色。
2. OpenCV 实现
OpenCV 提供cv2.GaussianBlur()函数实现高斯滤波。该函数的第一个参数为输入图像,第二个参数为高斯核大小,第三个参数为 X 方向的标准差。如果第三个参数为 0,OpenCV 会根据高斯核大小自动计算标准差。示例代码如下:
import cv2import numpy as npimport matplotlib.pyplot as plt# 读取图像img = cv2.imread('test.jpg')img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 高斯滤波gaussian_blurred = cv2.GaussianBlur(img, (5, 5), 0)# 显示结果plt.subplot(121), plt.imshow(img), plt.title('Original')plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(gaussian_blurred), plt.title('Gaussian Blurred')plt.xticks([]), plt.yticks([])plt.show()
四、中值滤波
1. 原理
中值滤波是一种非线性平滑算法,它将像素邻域内的所有像素值进行排序,取中间值作为当前像素的新值。中值滤波对椒盐噪声等脉冲噪声有很好的抑制作用,能有效保留图像边缘,避免图像模糊。与均值滤波和高斯滤波不同,中值滤波不是基于加权平均,而是通过排序选择中间值,因此在处理含有大量噪声的图像时,具有独特的优势。
2. OpenCV 实现
在 OpenCV 中,使用cv2.medianBlur()函数实现中值滤波。该函数的第一个参数为输入图像,第二个参数为内核大小,内核大小必须为奇数。示例如下:
import cv2import numpy as npimport matplotlib.pyplot as plt# 读取图像img = cv2.imread('test.jpg')img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 中值滤波median_blurred = cv2.medianBlur(img, 5)# 显示结果plt.subplot(121), plt.imshow(img), plt.title('Original')plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(median_blurred), plt.title('Median Blurred')plt.xticks([]), plt.yticks([])plt.show()
五、方框滤波
1. 原理
方框滤波是一种线性滤波方法,其操作与均值滤波极为相似。它以当前像素为中心划定一个矩形框(内核),将框内所有像素的和或者平均值,作为当前像素的输出值。方框滤波有归一化和非归一化两种模式。在归一化模式下,计算内核区域内像素的平均值,等同于均值滤波;非归一化模式则直接返回内核区域内像素的总和,这种情况下输出值可能超出图像数据类型的表示范围,需进行额外处理。
2. OpenCV 实现
在 OpenCV 中,通过cv2.boxFilter()函数实现方框滤波,该函数的参数包括输入图像、输出图像深度、内核大小,此外还可指定锚点位置、是否归一化以及边界处理方式。下面是使用cv2.boxFilter()进行方框滤波的示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img = cv2.imread('test.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 方框滤波,归一化模式
box_blurred = cv2.boxFilter(img, -1, (5, 5), normalize = True)# 显示结果
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(box_blurred), plt.title('Box Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
六、总结
本文详细介绍了 OpenCV 中的图像平滑处理技术,包括均值滤波、高斯滤波、中值滤波和双边滤波。每种算法都有其独特的原理和适用场景,均值滤波简单快速,但易模糊图像边缘;高斯滤波在去除噪声的同时能较好保留图像细节;中值滤波对脉冲噪声有很好的抑制效果;双边滤波则能在平滑图像的同时,有效保留图像边缘。在实际应用中,需根据图像特点和处理需求,选择合适的平滑算法,达到最佳的处理效果。
相关文章:
OpenCV--图像平滑处理
在数字图像处理领域,图像平滑处理是一项极为重要的技术,广泛应用于计算机视觉、医学影像分析、安防监控等多个领域。在 OpenCV 这一强大的计算机视觉库的助力下,我们能便捷地实现多种图像平滑算法。本文将深入探讨图像平滑的原理,…...
8. git branch
基本概述 git branch 的作用是:查看、创建、删除、重命名和跟踪分支等。 查看分支 1.查看本地分支 git branch当前分支前会标记 * 2.查看远程分支 git branch -r3.查看所有分支 git branch -a4.查看分支信息 git branch -v会显示分支的最新提交信息 5.查看…...
辛格迪客户案例 | 北京舒曼德医药实施电子合约系统(eSign)
01 北京舒曼德医药科技开发有限公司:医药科技的数字化先锋 北京舒曼德医药科技开发有限公司(以下简称“舒曼德医药”)作为国内医药科技领域的领军企业,致力于创新药物的研发、临床试验和市场推广。公司以“科技兴药、质量为先、服…...
Python面向对象-开闭原则(OCP)
1. 什么是开闭原则? 开闭原则(Open-Closed Principle, OCP) 是面向对象设计的五大SOLID原则之一,由Bertrand Meyer提出。其核心定义是: “软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。” 对扩展开放:当需求…...
网络安全-等级保护(等保) 1-0 等级保护制度公安部前期发文总结
################################################################################ 等级保护从1994年开始已经有相关文件下发,进行建设,后续今年多年制度完善,现在已进入等保2.0时代,相关政策已运行多年。 前期等保相关发文,目前还在使用的包括:《中华人民共和国计算…...
Class 文件和类加载机制
一、Class 文件 与 类加载机制 概述 什么是 Class 文件? Java 源码(.java)经过 javac 编译器 编译生成的字节码文件(.class);由 JVM 识别执行,包含类的完整结构信息(如字段、方法、…...
Vue3+Vite+TypeScript+Element Plus开发-07.Mockjs引用与Axios封装
系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由-配置 文章目录 目录 系列文档目…...
安全理念和安全产品发展史
从安全理念的发展历史来看,技术与产品的演进始终围绕 “威胁对抗” 与 “业务适配” 两大核心展开。以下从七个关键阶段解析安全技术与产品的发展脉络,并结合最新实践与未来趋势提供深度洞察: 一、密码学奠基阶段(1970s 前) 安全理念:以 “信息保密” 为核心,防御手段…...
【Redis】背景知识
一、Redis的特性 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串),hash(哈希),list…...
Spring MVC 返回 JSON 视图的方式及对比(6种)
Spring MVC 返回 JSON 视图的方式及对比(新增 MappingJackson2JsonView) 1. 方式一:ResponseBody 注解 作用:直接返回对象,由消息转换器(如 Jackson)序列化为 JSON。 适用场景:简单…...
【Kafka基础】消费者命令行完全指南:从基础到高级消费
Kafka消费者是消息系统的关键组成部分,掌握/export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-console-consumer.sh工具的使用对于调试、测试和监控都至关重要。本文将全面介绍该工具的各种用法,帮助您高效地从Kafka消费消息。 1 基础消费模式 1.1 从最…...
在 Vue 中监听常用按键事件(回车,ESC 键,空格等)。
一、Vue 原生按键修饰符(推荐) html <!-- 常用按键监听 --> <input keyup.enter"submit" <!-- 回车键 -->keydown.esc"cancel" <!-- ESC 键 -->keyup.space"togglePlay" <!-- 空格键…...
航电系统的任务载荷集成技术要点概述!
一、任务载荷集成技术难点 1. 接口标准化与兼容性 异构设备协议冲突:不同厂商的载荷设备(如光学相机、雷达、电子战模块)采用不同的通信协议(如1553B、RS422、以太网),需设计统一的总线接口标准以支持即…...
OceanBase V4.3.5 上线全文索引功能,让数据检索更高效
近日,OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试,OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…...
Qt中的信号与槽及其自定义
信号源:哪个控件发的信号 信号的类型:用户进行不同的操作就会触发不同的信号 如点击按钮,在输入框移动光标,勾选一个复选框,选 择一个下拉框 信号的处理方式:槽(slot)----也就是函数,Qt中用con…...
【PFPGA学习】状态机思想编程HDLbitsFPGA练习
目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 4. 选型建议 三、HDLbitsFPGA练习记录(combinational logic…...
Android 中集成 Unity 工程的步骤
在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…...
Python从入门到精通全套视频教程免费
概述 📢 所有想学Python的小伙伴看过来!作为深耕编程领域的技术分享者,最新整理了一份Python从0到1的视频教程。 💡亮点 ✅ 保姆级系统路线:从环境搭建、语法精讲,到爬虫/数据分析/AI/Web全栈开发&#…...
关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践
以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…...
蓝桥杯:对字符串处理常用知识笔记
一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码(常用) #include <iostream> #in…...
实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js
文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中,Mark…...
【回眸】Linux 内核 (十四)进程间通讯 之 信号量
前言 信号量概念 信号量常用API 1.创建/获取一个信号量 2.改变信号量的值 3. 控制信号量 信号量函数调用 运行结果展示 前言 上一篇文章介绍的共享内存有局限性,如:同步与互斥问题、内存管理复杂性问题、数据结构限制问题、可移植性差问题、调试困难问题。本篇博文介…...
Redis的used_memory_peak_perc和used_memory_dataset_perc超过90%会怎么样
当Redis的used_memory_peak_perc(当前内存占历史峰值的百分比)和used_memory_dataset_perc(数据集内存占比)均超过90%时,可能引发以下问题及风险: 一、used_memory_peak_perc > 90% 的影响 内存交换风险…...
帆软fvs文件中某表格新增数据来声提醒
1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件(如 mp3 格式),并将其放置在合适的目录。 例如:%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」,输入以下 JavaScript …...
从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人
前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…...
Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。写入流程 命令执行:客户端发送写命令&am…...
深入理解 React useLayoutEffect:精准掌控 DOM 更新时机
一、useLayoutEffect 的核心定位 1.1 与 useEffect 的关键差异 特性useEffectuseLayoutEffect执行时机浏览器绘制后异步执行DOM 更新后、绘制前同步执行视觉影响可能产生布局闪烁避免布局抖动性能影响对渲染阻塞较小可能阻塞浏览器渲染适用场景数据获取、事件订阅等DOM 测量、…...
Spring Boot 3.x 中 WebClient 全面详解及示例
Spring Boot 3.x 中 WebClient 全面详解及示例 1. WebClient 简介 定义:Spring 5 引入的响应式 HTTP 客户端,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。核心特性: 支持所有 HTTP 方法&a…...
Vue3+Vite+TypeScript+Element Plus开发-06.Header响应式菜单缩展
系列文档目录 Vue3+Vite+TypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由-配置 文章目录 目录 系列文档…...
深入解析原生鸿蒙中的 RN 日志系统:从入门到精通!
全文目录: 开篇语📖 目录🎯 前言:鸿蒙日志系统究竟有多重要?🛠️ 鸿蒙 RN 日志系统的基础结构📜 1. 日志的作用⚙️ 2. 日志分类 🔧 如何在鸿蒙 RN 中使用日志系统🖋️ 1…...
