07 OpenCV各类滤波

news2024/10/6 8:29:07

1 均值滤波

均值滤波器是一种基本的线性滤波器,常用于图像处理中的平滑操作。在 OpenCV 中,可以使用cv2.blur()函数或cv2.boxFilter()函数进行均值滤波操作。
均值滤波器的原理是将每个像素的灰度值替换为其周围像素灰度值的平均值。其核心思想是去除图像中的高频噪声,同时保留图像中的低频信息。
在进行均值滤波操作时,需要定义一个滤波模板(也称为卷积核),通常是一个矩形区域,其大小由模板的宽度和高度决定。在模板中的每一个像素,都会与该像素周围的像素进行加权平均,从而得到新的像素值。
可以使用cv2.blur()函数或cv2.boxFilter()函数。cv2.blur()函数的基本语法如下:

dst = cv2.blur(src, ksize)

其中:

  • src:输入图像,可以为灰度图像或彩色图像。
  • ksize:滤波模板大小,必须为正奇数。当ksize为(5,5)时,表示使用5x5大小的矩形滤波器。
import cv2

img = cv2.imread('test.png')
blur = cv2.blur(img, (5,5))

cv2.imshow('original', img)
cv2.imshow('blurred', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

image.png

2 中值滤波

中值滤波与均值滤波非常相似,只是中值滤波赋给中间核心元素的数值是周边数值的中位数而非平均数。该方法的函数基本语法是:

dst = cv2.medianBlur(src, ksize)

3 高斯滤波

3.1 基本原理

高斯滤波(Gaussian Blur)是一种常见的图像滤波方法,它可以对图像进行平滑处理,减少噪声和细节,常用于预处理和特征提取等领域。其核心思想是使用高斯分布来模糊图像,使得图像中的高频噪声被滤除,从而达到平滑图像的效果。

高斯分布是一种常见的概率分布,它具有以下的概率密度函数:

G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2

其中, ( x , y ) (x, y) (x,y) 是高斯分布的二维坐标, σ \sigma σ 是高斯分布的标准差。高斯分布的形状是一个钟形曲线,具有对称性,随着距离坐标中心点越远,其值逐渐变小。在高斯滤波的卷积核中,离中心越近,权重越高。

在高斯滤波中,我们使用一个大小为 k × k k \times k k×k 的二维卷积核来进行滤波,该卷积核的值由高斯分布产生。具体而言,对于图像中的每个像素 ( i , j ) (i, j) (i,j),我们将高斯滤波器与该像素的邻域 N i , j N_{i,j} Ni,j 进行卷积运算,得到新的像素值 I ′ ( i , j ) I'(i, j) I(i,j)

I ′ ( i , j ) = 1 k 2 ∑ u = − k / 2 k / 2 ∑ v = − k / 2 k / 2 G ( u , v ) ⋅ I ( i + u , j + v ) I'(i, j) = \frac{1}{k^2} \sum_{u=-k/2}^{k/2}\sum_{v=-k/2}^{k/2} G(u, v) \cdot I(i+u, j+v) I(i,j)=k21u=k/2k/2v=k/2k/2G(u,v)I(i+u,j+v)

其中, G ( u , v ) G(u, v) G(u,v) 表示高斯滤波器在 ( u , v ) (u, v) (u,v) 处的值, I ( i + u , j + v ) I(i+u, j+v) I(i+u,j+v) 表示输入图像在 ( i + u , j + v ) (i+u, j+v) (i+u,j+v) 处的像素值。

注意,这里我们对卷积核中每个元素乘上了 1 / k 2 1/k^2 1/k2 的缩放因子,这是为了避免滤波后图像的亮度变化。

3.2 对应函数

在OpenCV中,可以使用 cv2.GaussianBlur() 函数来进行高斯滤波。该函数的参数包括输入图像、卷积核大小、高斯分布的标准差等,函数的语法如下:

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

其中,参数含义如下:

  • src:输入图像。
  • ksize:滤波器的大小。该参数必须为正的奇数。 如果指定了宽度和高度,则它们应该分别指定为 ksize.widthksize.height。如果将该参数设置为零,OpenCV 会自动计算滤波器大小。
  • sigmaX:高斯分布在 x x x 方向的标准差。如果该值为零,OpenCV 会根据 ksize 来计算标准差。
  • dst:输出图像。如果未提供,则函数会创建一个与 src 具有相同尺寸和类型的输出图像。
  • sigmaY:高斯分布在 y y y 方向的标准差。如果将该值设置为零,那么函数会将其设置为 sigmaX 的值,即沿着 x x x y y y 方向使用相同的标准差。
  • borderType:边界模式。默认值为 cv2.BORDER_DEFAULT。个人不建议修改。

示例代码如下:

import cv2  
img = cv2.imread("test.png")  # 读取原图  
dst1 = cv2.GaussianBlur(img, (5, 5), 0, 0)  # 使用大小为5*5的滤波核进行高斯滤波  
dst2 = cv2.GaussianBlur(img, (9, 9), 0, 0)  # 使用大小为9*9的滤波核进行高斯滤波  
dst3 = cv2.GaussianBlur(img, (15, 15), 0, 0)  # 使用大小为15*15的滤波核进行高斯滤波  
cv2.imshow("img", img)  
cv2.imshow("5", dst1)  
cv2.imshow("9", dst2)  
cv2.imshow("15", dst3)  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png

随着滤波核的变大,图像逐渐模糊。高斯滤波器在图形处理中可以产生较好的毛玻璃效果。

4 双边滤波器

双边滤波器(Bilateral Filter)是一种非线性滤波器,它可以保留图像边缘信息的同时进行平滑处理,常用于去除图像中的噪声。

双边滤波器在空间域和灰度值域均使用了高斯滤波器,但是在进行灰度值域的滤波时,它使用了不同于高斯分布的加权函数。双边滤波器的加权函数有两个参数:一个是空间域的标准差,用于控制像素之间距离的影响;另一个是灰度值域的标准差,用于控制像素之间灰度值差异的影响。这样就可以保留图像中的边缘信息,同时去除噪声。

使用 cv2.bilateralFilter() 函数来应用双边滤波器。函数的语法如下:

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst

其中:

  • src:输入图像。
  • d:滤波器的直径。该参数应该是正的奇数。
  • sigmaColor:颜色空间的标准差,用于控制灰度值域的影响。
  • sigmaSpace:空间域的标准差,用于控制像素之间距离的影响。
  • dst:输出图像。如果未提供,则函数会创建一个与 src 具有相同尺寸和类型的输出图像。
  • borderType:边界模式。默认值为 cv2.BORDER_DEFAULT

下面对比一下高斯滤波器和双边滤波器:

import cv2  
img = cv2.imread("test.png")  # 读取原图  
dst1 = cv2.GaussianBlur(img, (15, 15), 0, 0)  # 使用大小为15*15的滤波核进行高斯滤波  
# 双边滤波,选取范围直径为15,颜色差为120  
dst2 = cv2.bilateralFilter(img, 15, 120, 100)  
cv2.imshow("img", img)  
cv2.imshow("Gauss", dst1)  # 显示高斯滤波效果  
cv2.imshow("bilateral", dst2)  # 显示双边滤波效果  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png
可以看出双边滤波器在部分区域并没有进行模糊处理。

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

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

相关文章

Android App开发基础

文章目录一 App的开发特点1.1 App的运行环境1.2 App开发语言1.3 java语言开发1.4 Kotlin语言开发1.5 XML1.6 App连接的数据库二 App的工程结构2.1 App工程目录结构2.2 构建工具Grade2.3 编译配置文件build.gradle2.4 运行配置文件AndroidManifest.xml2.4.1 application2.4.2 ac…

科研试剂供应Pyrene-PEG3-Propargyl,芘甲酰胺-三聚乙二醇-丙炔

Pyrene-PEG3-Propargyl,Propargyl-PEG3-Pyrene,芘甲酰胺-三聚乙二醇-丙炔,芘甲酰胺三聚乙二醇丙炔反应特点:Pyrene-PEG3-Propargyl属于炔基点击试剂,点击化学的概念对化学合成领域有很大的贡献,在药 物开发…

nvdiffrast

nvidiffrast主页https://arxiv.org/pdf/2011.03277.pdfhttps://github.com/NVlabs/nvdiffrast CSC2547 Differentiable Rendering A Survey https://www.youtube.com/watch?v7LU0KcnSTc4 DR https://blog.qarnot.com/an-overview-of-differentiable-rendering/ 知乎 https:…

找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。

测试工程师招了快一个月了,实在招不到合适的,已经在被解雇的边缘了。。。” 初级测试工程师非常多,但真正掌握测试思维、能力强的优秀测试太少了! 据我所知, 当下的测试人员不少状态都是这样的: 在工作中…

设计模式C++实现18:迭代器模式(Iterator)

意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 上下文:集合对象内部结构常常变化各异。对于这些集合对象,能否在不暴露其内部结构的同时,让外部Client透明地访问其中包含的元素…

动态规划(楼梯和股票问题)

❤ 作者主页:李奕赫揍小邰的博客 ❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~* 🍊 记得点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习!!!🎉🎉 文章目录动态规划&…

抓包工具Charles(一)-下载安装与设置

无论是在测试、开发工作中,抓包都是很重要、很常用的技能。Charles作为一款抓包工具,能够满足大部分的工作需求。 文章目录一、下载地址二、安装三、安装根证书(电脑)四、设置五、抓包附录:[零基础入门接口功能测试教程…

<JVM上篇:内存与垃圾回收篇>10 - StringTable

笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录10.1. String 的基本特性10.1.1. String 在 jdk9 中存储结构变更MotivationDescription10.1.2. String 的基本特性10.2. String 的内…

ARMv8 同步和信号量(Synchronization and semaphores)简介

目录 1,Load-Exclusive/Store-Exclusive 概述 2,独占式访问指令与非共享内存( Exclusive access instructions and Non-shareable memory locations) 3,独占式访问指令与共享内存( Exclusive access instructions and shareable memory lo…

文华财经期货波段趋势K线结构主图阶梯公式源码,极品多空红绿轨道指标公式

期货指标公式是通过数学逻辑角度计算而来,仅是期货分析环节中的一个辅助工具。期货市场具有不确定性和不可预测性的,请正常对待和使用指标公式! 第一步:判大势 所谓判大势,就是判断当前行情趋势,是入场前的必备步骤。…

中汽协确认参加2023EVH新能源动力总成年会

演讲主题:中国汽车工业经济运行情况 演讲大纲: 对中国汽车工业近期发展态势进行分析2023年汽车行业预测 陈士华 现任中国汽车工业协会副秘书长,兼任中国汽车工业经济技术信息研究所有限公司总经理 1999年3月至今,就职于中国汽…

接口自动化测试框架(Java 实现)

需求分析 需求点需求分析通过 yaml 配置接口操作和用例后续新增接口和测试用例只需要编写 yaml 文件即可实现。可以支持接口间的参数传递具有参数依赖的接口可以进行变量的抽取和参数赋值。支持全局、用例维度的变量存储比如时间截命名法中要用到的时间截后缀。支持用例软断言…

Go语言入门【10】Map

Map map是一种键值对形式的数据结构,一个键对应一个值,可以通过键快速检索出其对应的value值,在map中key的值是唯一的,value的值不唯一,并且map中保存的数据是无序的。 Map声明 声明Map可以使用map关键字进行声明&a…

【Yolov7】配置参数以及训练模型

一、下载Yolov7 github地址:https://github.com/WongKinYiu/yolov7 或者命令行下载 git clone https://github.com/WongKinYiu/yolov7.git二、新建一个Python环境 用Acaconda新建一个干净的环境,我命名为yolov7,python版本选择3.8 进入到…

GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)

😄 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构:1.2、范式:预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式:预…

C语言运算符(左值右值,基本运算符)

一.数据对象,左值,右值,运算符 数据对象:用于存储值的数据存储区域统称,而使用变量名是标识对象的一种方法(还有指针,后面会教的) 左值:用于标识特定数据对象的名称或表…

图的总复习

一、图的定义Graph 图是由顶点vertex集合及顶点间关系集合组成的一种数据结构: 顶点的集合 和 边的集合 二、无向图 用(x,y)表示两个顶点x和y之间的一条边(edge) 边是无方向的 N{V,E},V{0…

【学习总结】2023寒假总结

写在前面时光匆匆,白驹过隙,转眼间寒假就过去了,这次寒假可以算的上是最长的一次假期,经历了从疫情到放开,从患病到阳康,在现实与虚幻的世界中玩耍,在痛苦的数据结构中徘徊,在每次早…

FFMPEG自学一 音视频解封装

一、音视频包含哪些数据对于一个mp4文件我们可以通过音视频分析软件打开查看内部信息。从两图可以看出mp4文件一般包含 音频流 视频流等。对于上面的字段大致分析如下Format编码方式AVC现在大部分视频都是这种编码方式,即H264。CodecId编码器idavc1H264封装有2种格式…

(二)随处可见的LED广告屏是怎么工作的呢?代码实现

书接上回,上一篇中我们聊到了LED点阵屏的工作原理和一些电气参数。本篇以第一篇为基础,对软件层面进行展开,同时也为下一篇接入GUI做铺垫。文章较第一篇有所增长,大概需要5~7分钟可以看完。【目标】能够随心所欲的显示我们想要的图…