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 中的图像平滑处理技术,包括均值滤波、高斯滤波、中值滤波和双边滤波。每种算法都有其独特的原理和适用场景,均值滤波简单快速,但易模糊图像边缘;高斯滤波在去除噪声的同时能较好保留图像细节;中值滤波对脉冲噪声有很好的抑制效果;双边滤波则能在平滑图像的同时,有效保留图像边缘。在实际应用中,需根据图像特点和处理需求,选择合适的平滑算法,达到最佳的处理效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能优化利器:前后端防抖方案解析

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在Web开发中,高频触发的事件(如用户输入、按钮点击、滚动监听等)可能导致性能问题或资源浪费。防抖(Debounce&…

【ES系列】Elasticsearch简介:为什么需要它?(基础篇)

🔥 本文将详细介绍Elasticsearch的前世今生,以及为什么它在当今的技术栈中如此重要。本文是ES起飞之路系列的基础篇第一章,适合想要了解ES的读者。 文章目录 一、什么是Elasticsearch?1. ES的定义2. ES的核心特性2.1 分布式存储2.2 实时搜索2.3 高可用性2.4 RESTful API3.…

用 HTML 网页来管理 Markdown 标题序号

文章目录 工具介绍核心优势使用指南基本使用方法注意事项 部分截图完整代码 工具介绍 在日常的文档编写和博客创作中,Markdown因其简洁的语法和良好的可读性而广受欢迎。然而,当文档结构复杂、标题层级较多时,手动维护标题序号不仅耗时耗力&…

批量将 Markdown 转换为 Word/PDF 等其它格式

在工作当中,我们经常会接触到 Markdown 格式的文档。这是一种非常方便我们做记录,做笔记的一种格式文档。现在很多互联网编辑器都是支持 Markdown 格式的,编辑起文章来更加的方便简介。有时候,我们会碰到需要将 Markdown 格式的文…

剑指Offer(数据结构与算法面试题精讲)C++版——day8

剑指Offer(数据结构与算法面试题精讲)C版——day8 题目一:链表中环的入口节点题目二:两个链表的第1个重合节点题目三:反转链表附录:源码gitee仓库 题目一:链表中环的入口节点 这道题的有如下三个…

【BFT帝国】20250409更新PBFT总结

2411 2411 2411 Zhang G R, Pan F, Mao Y H, et al. Reaching Consensus in the Byzantine Empire: A Comprehensive Review of BFT Consensus Algorithms[J]. ACM COMPUTING SURVEYS, 2024,56(5).出版时间: MAY 2024 索引时间(可被引用): 240412 被引:…

前端用用jsonp的方式解决跨域问题

前端用用jsonp的方式解决跨域问题 前端用用jsonp的方式解决跨域问题 前端用用jsonp的方式解决跨域问题限制与缺点:前端后端测试使用示例 限制与缺点: 不安全、只能使用get方式、后台需要相应jsonp方式的传参 前端 function jsonp(obj) {// 动态生成唯…

MySQL详解最新的官方备份方式Clone Plugin

一、Clone Plugin的动态安装 install plugin clone soname mysql_clone.so;select plugin_name,plugin_status from information_schema.plugins where plugin_name clone; 二、Clone Plugin配置持久化 在 MySQL 配置文件my.cnf中添加以下内容,确保插件在 MySQL …

解决python manage.py shell ModuleNotFoundError: No module named xxx

报错如下&#xff1a; python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…

鸿蒙NEXT开发资源工具类(ArkTs)

import { AppUtil } from ./AppUtil; import { StrUtil } from ./StrUtil; import { resourceManager } from kit.LocalizationKit;/*** 资源工具类。* 提供访问应用资源的能力&#xff0c;包括布尔值、数字、字符串等资源的获取。** author 鸿蒙布道师* since 2025/04/08*/ ex…

css使用mix-blend-mode的值difference实现内容和父节点反色

1. 使用场景 往往开发过程中&#xff0c;经常遇到产品说你这个背景图和文字颜色太接近了&#xff0c;能不能适配下背景图&#xff0c;让用户能够看清具体内容是啥。 这么说吧&#xff0c;这种需求场景非常合理&#xff0c;因为你做开发就是要给用户一个交代&#xff0c;给他们…

el-input 中 select 方法使用报错:属性“select”在类型“HTMLElement”上不存在

要解决该错误&#xff0c;需明确指定元素类型为 HTMLInputElement&#xff0c;因为 select() 方法属于输入元素。 步骤解释&#xff1a; 类型断言&#xff1a;使用 as HTMLInputElement 将元素类型断言为输入元素。 可选链操作符&#xff1a;保持 ?. 避免元素为 null 时出错…

Mybatis Plus与SpringBoot的集成

Mybatis Plus与SpringBoot的集成 1.引入Maven 依赖2.配置application.yml文件3.创建实体类4.分页插件5.逻辑删除功能6.忽略特定字段7.自动填充 1.引入Maven 依赖 提前创建好一个SpringBoot项目&#xff0c;然后在项目中引入MyBatis Plus依赖 <dependency><groupId&g…

大数据学习(104)-clickhouse与hdfs

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

【简历全景认知2】电子化时代对简历形式的降维打击:从A4纸到ATS的生存游戏

一、当简历遇上数字洪流:传统形式的式微 在1990年代,一份排版精美的纸质简历还能让HR眼前一亮;但今天,超过75%的 Fortune 500 企业使用ATS(Applicant Tracking System)进行初筛,未优化的简历可能在5秒内就会沦为数字废土。这种变迁本质上符合「技术接纳生命周期」理论—…

esp32cam -> 服务器 | 手机 -> 服务器 直接服务器传输图片

服务器先下载python &#xff1a; 一、Python环境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一条一条执行 安装基础依赖 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…

SeaTunnel系列之:Apache SeaTunnel编译和安装

Apache SeaTunnel编译 Prepare编译克隆源代码本地安装子项目从源代码构建 SeaTunnel构建子模块安装 JetBrains IDEA Scala 插件安装 JetBrains IDEA Lombok 插件代码风格运行简单示例不仅如此 安装下载 SeaTunnel 发布包下载连接器插件从源代码构建 SeaTunnel 运行 SeaTunnel 在…

JavaScript/React中,...(三个连续的点)被称为 扩展运算符(Spread Operator) 或 剩余运算符(Rest Operator)

const processOrder (order) > {const tax order.total * 0.1;const finalAmount order.total tax;return { ...order, tax, finalAmount }; }; 解释一下&#xff0c;特别&#xff1a;...?在JavaScript/React中&#xff0c;...&#xff08;三个连续的点&#xff09;被称…

FRP的proxies只是建立通道,相当于建立与服务器沟通的不同通道而不是直接将路由器与服务器云端沟通

没有更好的办法了吗&#xff0c;我看frpc.toml的里面可以设置两个proxies那我esp32的监听端口设置在frpc.toml里面它不也能跟云服务器建立联系吗&#xff0c;比如远程与本地端口都配置为5112那云服务器接收到的5112访问会以frp配置的本地端口5112转发到frp客户端的路由器&#…

#在docker中启动mysql之类的容器时,没有挂载的数据...在后期怎么把数据导出外部

如果要导出 Docker 容器内的 整个目录&#xff08;包含所有文件及子目录&#xff09;&#xff0c;可以使用以下几种方法&#xff1a; 方法 1&#xff1a;使用 docker cp 直接复制目录到宿主机 适用场景&#xff1a;容器正在运行或已停止&#xff08;但未删除&#xff09;。 命…