010 OpenCV中的4种平滑滤波

目录

一、环境

二、平滑滤波

2.1、均值滤波

2.2、高斯滤波

2.3、中值滤波

2.4、双边滤波

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、平滑滤波

2.1、均值滤波

在OpenCV库中,blur函数是一种简单而有效的图像平滑处理方法,也被称为均值滤波。该函数通过将图像中每个像素的值设置为其邻域中像素值的平均值,从而消除图像中的噪声。

函数原型如下:

cv2.blur(src, ksize[, dst[, anchor]])

参数解释:

  • src: 输入图像。它必须是8位或32位浮点型。
  • ksize: 这是均值滤波器的大小,它必须是奇数,并且可以有两种形式:例如 (5,5) 或 5. 在第二种情况下,滤波器将是正方形的,而在第一种情况下,滤波器将是矩形的。
  • dst: 输出图像。它的类型和源图像相同。
  • anchor: 锚点的位置。默认值是 (-1,-1),这表示锚点在滤波器的中心。

下面是一个简单的示例:

import cv2 
import numpy as np 
# 加载图像 
img = cv2.imread('image.jpg') 
# 应用blur函数 
blurred = cv2.blur(img, (5,5)) # 使用5x5的滤波器 
# 显示原图和处理后的图像 
cv2.imshow('Original Image', img) 
cv2.imshow('Blurred Image', blurred) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

需要注意的是,虽然blur函数可以有效地消除噪声,但它也可能导致图像失去一些细节。因此,在使用此函数时,您可能需要考虑在消除噪声和保留细节之间取得平衡。

2.2、高斯滤波

GaussianBlur是OpenCV库中的一个函数,它用于对图像进行高斯模糊。高斯模糊是一种图像处理技术,通过对图像的每个像素应用一个高斯函数来达到模糊效果。这种方法在消除噪声和细节提取方面非常有效。

函数原型如下:

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

参数解释:

  • src: 输入图像。它必须是8位或32位浮点型。
  • ksize: 高斯核的大小。这个值必须是正整数,并且可以有两种形式:例如 (5,5) 或 5. 在第二种情况下,滤波器将是正方形的,而在第一种情况下,滤波器将是矩形的。
  • sigmaX: 表示高斯核函数在X方向的标准偏差。如果sigmaX是0,那么标准偏差将根据核大小ksize计算。
  • dst: 输出图像。它的类型和源图像相同。
  • sigmaY: 表示高斯核函数在Y方向的标准偏差。如果sigmaY是0,那么标准偏差将根据核大小ksize计算。
  • borderType: 像素外插法,默认值为cv2.BORDER_DEFAULT。

下面是一个简单的示例:

python
import cv2  
import numpy as np  # 加载图像  
img = cv2.imread('image.jpg')  # 应用GaussianBlur函数  
blurred = cv2.GaussianBlur(img, (5,5), 0) # 使用5x5的高斯滤波器,无sigmaY值,所以根据核大小计算标准偏差  # 显示原图和处理后的图像  
cv2.imshow('Original Image', img)  
cv2.imshow('Blurred Image', blurred)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

与blur函数相比,GaussianBlur可以提供更加柔和的模糊效果,因为它考虑了图像的更多频率内容。但是,这也会导致更多的细节丢失。因此,在使用此函数时,您可能需要考虑在消除噪声和保留细节之间取得平衡。

2.3、中值滤波

medianBlur函数是OpenCV库中的一个函数,用于对图像进行中值滤波处理,即使用中值滤波器来平滑图像。

函数原型如下:

cv2.medianBlur(src, ksize[, dst])
  • src: 输入图像,必须是8位或32位浮点型。
  • ksize: 滤波器的大小,必须是奇数,可以有两种形式:例如 (5,5) 或 5。当ksize为3或者5的时候,图像深度需为CV_8U,CV_16U,或CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U。
  • dst: 输出图像,类型和源图像相同。可以用Mat::Clone来初始化得到目标图。

medianBlur函数使用中值滤波器来平滑图像。对于多通道图片,每一个通道都单独进行处理,并且支持就地操作(In-place operation)。在边界类型(BorderTypes)方面,使用的是BORDER_REPLICATE。

2.4、双边滤波

双边滤波(Bilateral Filter)是一种非线性的滤波方法,结合了图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。 但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

三、完整代码

import sys
import cv2 as cv
import numpy as np#  Global VariablesDELAY_CAPTION = 1500
DELAY_BLUR = 100
MAX_KERNEL_LENGTH = 31src = None
dst = None
window_name = 'Smoothing Demo'def main(argv):cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)# 读取图片imageName = argv[0] if len(argv) > 0 else 'data/lena.jpg'global srcsrc = cv.imread(cv.samples.findFile(imageName))if src is None:print ('Error opening image')return -1if display_caption('Original Image') != 0:return 0global dstdst = np.copy(src)if display_dst(DELAY_CAPTION) != 0:return 0# 均值滤波if display_caption('Homogeneous Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.blur(src, (i, i))if display_dst(DELAY_BLUR) != 0:return 0# 高斯滤波if display_caption('Gaussian Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.GaussianBlur(src, (i, i), 0)if display_dst(DELAY_BLUR) != 0:return 0# 中值滤波if display_caption('Median Blur') != 0:return 0for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.medianBlur(src, i)if display_dst(DELAY_BLUR) != 0:return 0# 双边滤波if display_caption('Bilateral Blur') != 0:return 0# 双边滤波计算量相对大,所以当kernel半径很大的时候,就会较慢for i in range(1, MAX_KERNEL_LENGTH, 2):dst = cv.bilateralFilter(src, i, i * 2, i / 2)if display_dst(DELAY_BLUR) != 0:return 0display_caption('Done!')return 0# 显示黑色背景+文字
def display_caption(caption):global dstdst = np.zeros(src.shape, src.dtype)rows, cols, _ch = src.shapecv.putText(dst, caption, (int(cols / 4), int(rows / 2)), cv.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255))return display_dst(DELAY_CAPTION)# 显示效果图
def display_dst(delay):cv.imshow(window_name, dst)c = cv.waitKey(delay)if c >= 0 : return -1return 0if __name__ == "__main__":main(sys.argv[1:])

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

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

相关文章

【Docker】从零开始:9.Docker命令:Push推送仓库(Docker Hub,阿里云)

【Docker】从零开始:9.Docker命令:Push推送仓库 知识点1.Docker Push有什么作用?2.Docker仓库有哪几种2.1 公有仓库2.2 第三方仓库2.3 私有仓库2.4 搭建私有仓库的方法有哪几种 3.Docker公有仓库与私有仓库的优缺点对比 Docker Push 命令标准语法操作参数…

中国毫米波雷达产业分析2——毫米波雷达产业链分析

一、产业链构成 毫米波雷达产业链分为三部分:上游主要包括射频前端组件(MMIC)、数字信号处理器(DSP/FPGA)、高频PCB板、微控制器(MCU)、天线及控制电路等硬件供应商;中游主体是毫米波…

使用Python实现几种底层技术的数据结构

使用Python实现几种底层技术的数据结构 数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这…

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

解决Vscode使用git提交卡住的问题

使用Vscode的git提交代码经常会很慢/卡住。 先点击左下角,进入设置 找到git的配置(建议直接搜索),把use Editor As commit input的勾选去掉即可解决。

Sentinel 监控数据持久化(mysql)

Sentinel 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制,即自行扩展实现 MetricsRepository 接口(修改 控制台源码)。 本文通过使用Mysql持久化监控数据。 1.构建存储表&#xff08…

【Windows 常用工具系列 12 -- win11怎么设置不睡眠熄屏 |win11设置永不睡眠的方法】

文章目录 win11 怎么设置不睡眠熄屏 使用笔记本电脑的时候,如果离开电脑时间稍微长一点就会发现息屏了,下面介绍 设置 Win11 永不睡眠息屏的方法,有需要的朋友们快来看看以下详细的教程。 win11 怎么设置不睡眠熄屏 在电脑桌面上&#xff0c…

C++11『lambda表达式 ‖ 线程库 ‖ 包装器』

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2022 版本 17.6.5 文章目录 🌇前言🏙️正文1.lambda表达式1.1.仿函数的使用1.2.lambda表达式的语法1.3.lambda表达式的使用…

快速在WIN11中本地部署chatGLM3

具体请看智谱仓库github:GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 或者Huggingface:https://huggingface.co/THUDM/chatglm3-6b 1. 利用Anaconda建立一个虚拟环境: conda create -n chatglm3 pyt…

Redis打包事务,分批提交

一、需求背景 接手一个老项目,在项目启动的时候,需要将xxx省整个省的所有区域数据数据、以及系统字典配置逐条保存在Redis缓存里面,这样查询的时候会更快; 区域数据字典数据一共大概20000多条,,前同事直接使用 list.forEach…

分布式链路追踪入门篇-基础原理与快速应用

为什么需要链路追踪? 我们程序员在日常工作中,最常做事情之一就是修bug了。如果程序只是运行在单机上,我们最常用的方式就是在程序上打日志,然后程序运行的过程中将日志输出到文件上,然后我们根据日志去推断程序是哪一…

TCL脚本语言光速入门教程,一篇就够了(超全查表)

目录 引子:初见TCL 基本命令 置换命令 普通置换 变量置换 命令置换 反斜杠置换 其他置换 脚步命令 eval命令 source命令 语言命令 简单变量 数组变量 重构变量及其操作 补充概念 全局变量和局部变量 小结 最近突然遇到了要用TCL脚本语言操作的需求…

C/C++小写字母的判断 2022年3月电子学会中小学生软件编程(C/C++)等级考试一级真题答案解析

目录 C/C小写字母的判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C小写字母的判断 2022年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个字符,判断是否是英文小…

Qt/QML编程学习之心得:一个Qt工程的学习笔记(九)

1、.pro文件 加CONFIG += c++11,才可以使用Lamda表达式(一般用于connect的内嵌槽函数) 2、QWidget 这是Qt新增加的一个类,基类,窗口类,QMainWindow和QDialog都继承与它。 3、Main函数 QApplication a应用程序对象,有且仅有一个 a.exec() 进行消息循环、阻塞 MyWi…

设计模式-解析器-笔记

“领域规则”模式 在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将稳日抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式:Interpreter 动机(Motivation) 在…

【Axure教程】用中继器制作卡片多条件搜索效果

卡片设计通过提供清晰的信息结构、可视化吸引力、易扩展性和强大的交互性,为用户界面设计带来了许多优势,使得用户能够更轻松地浏览、理解和互动。 那今天就教大家如何用中继器制作卡片的模板,以及完成多条件搜索的效果,我们会以…

云原生入门系列(背景和驱动力)

做任何一件事,或者学习、应用一个领域的技术,莫过于先要想好阶段的目标和理解、学习它的意义是什么?解决了什么问题? 这部分,就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…

【开源】基于Vue.js的衣物搭配系统的设计和实现

项目编号: S 016 ,文末获取源码。 \color{red}{项目编号:S016,文末获取源码。} 项目编号:S016,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…

解锁潜力:创建支持Actions接口调用的高级GPTs

如何创建带有Actions接口调用的GPTs 在本篇博客中,我们将介绍如何创建一个带有Actions接口调用的GPTs ,以及如何进行配置和使用。我们将以 https://chat.openai.com/g/g-GMrQhe7ka-gptssearch 为例,演示整个过程。 Ps: 数据来源&#xff1a…

全网最全c++中的system详解

这篇文章是二发,做了些微调,感兴趣的朋友可以看原文:C中的system_一只32汪的博客-CSDN博客 1,简介 system()函数是在C制作中十分常用,有用的一个函数。 其效果类似于系统中"cmd"控制台和"bat"文件…