当前位置: 首页 > news >正文

OpenCV基础知识(6)— 滤波器

前言:Hello大家好,我是小哥谈。在尽量保留原图像信息的情况下,去除图像内噪声、降低细节层次信息等一系列过程,被叫做图像的平滑处理(或者叫图像的模糊处理)。实现平滑处理最常用的工具就是滤波器。通过调节滤波器的参数,可以控制图像的平滑程度。OpenCV提供了种类丰富的滤波器,每种滤波器使用的算法均不相同,但都能对图像中的像素值进行微调,让图像呈现平滑效果。本节将介绍均值滤波器、中值滤波器、高斯滤波器和双边滤波器的使用方法。🌈

前期回顾:

              史上最全OpenCV常用方法及使用说明汇总,建议收藏!

              OpenCV基础知识(1)— OpenCV概述

              OpenCV基础知识(2)— 图像处理的基本操作

              OpenCV基础知识(3)— 图像数字化基础(像素、色彩空间) 

              OpenCV基础知识(4)— 绘制图形

              OpenCV基础知识(5)— 几何变换 

              目录

🚀1.均值滤波器

🚀2.中值滤波器

🚀3.高斯滤波器

🚀4.双边滤波器

🚀5.总结

🚀1.均值滤波器

图像中可能会出现这样一种像素:该像素与周围像素的差别非常大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素,这样的噪声也被称为“椒盐噪声”或“盐噪声”。

以一个像素为核心,核心周围像素可以组成一个n行n列(简称 n×n)的矩阵,这样的矩阵结构在滤波操作中被称为“滤波核”。矩阵的行列数决定了滤波核的大小,例如下图所示,滤波核大小为3×3,包含9个像素。🌴

均值滤波器(也被称为低通滤波器)可以把图像中的每一个像素都当做滤波核的核心,然后计算出核内所有像素的平均值,最后让核心像素值等于这个平均值。

OpenCV将均值滤波器封装成了blur()方法,其语法如下:

dst = cv2.blur(src,ksize,anchor,borderType)

参数说明:

src:被处理的图像

ksize:滤波核大小,其格式为(高度,宽度),建议使用如(3,3)、(5,5)等宽高相等的奇数边长。滤波核越大,处理之后的图像就越模糊。

anchor:可选参数,滤波核的锚点,建议采用默认值,方法可以自动计算锚点。

boderType:可选参数,边界样式,建议采用默认值。

返回值说明:

dst:经过均值滤波处理之后的图像

案例:

使用大小为9×9的滤波核对图像进行均值滤波操作,代码如下:

import cv2
img = cv2.imread("1.webp")  # 读取原图
dst1 = cv2.blur(img, (9, 9))  # 使用大小为9*9的滤波核进行均值滤波
cv2.imshow("img", img)  # 显示原图
cv2.imshow("9*9", dst1)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

说明:♨️♨️♨️

滤波核越大,处理之后的图像就越模糊。 


🚀2.中值滤波器

中值滤波器的原理与均值滤波器非常相似,唯一的不同就是不会计算像素的平均值,而是将所有像素值进行排序,把最中间的像素值取出,赋值给核心像素。

OpenCV将中值滤波器封装成了medianBlur()方法,其语法如下:

dst = cv2.medianBlur(src,ksize)

参数说明:

src:被处理的图像

ksize:滤波核的边长,必须是大于1的奇数,例如3、5、7等。方法会根据此边长自动创建一个正方形的滤波核。

返回值说明:

dst:经过中值滤波处理之后的图像

案例:

使用边长为9的滤波核对图像进行中值滤波操作,代码如下:

import cv2
img = cv2.imread("1.webp")  # 读取原图
dst1 = cv2.medianBlur(img, 9)  # 使用宽度为9的滤波核进行中值滤波
cv2.imshow("img", img)  # 显示原图
cv2.imshow("9", dst1)  # 显示滤波效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

说明:♨️♨️♨️

1.中值滤波器语法中的ksize参数是边长,而其它滤波器的ksize参数通常是(高,宽) 。

2.滤波核的边长越长,处理之后的图像就越模糊。

3.中值滤波处理的图像会比均值滤波处理的图像丢失更多细节。


🚀3.高斯滤波器

高斯滤波也被称为高斯模糊、高斯平滑,是目前应用最广泛的平滑处理算法。高斯滤波可以很好地在降低图片噪声、细节层次的同时保留更多的图像信息,经过处理的图像会呈现“磨砂玻璃”的滤镜效果。

OpenCV将高斯滤波器封装成了GaussianBlur()方法,其语法如下:

dst = cv2.GaussianBlur(src,ksize,sihmaX,sigmaY,borderType)

参数说明:

src:被处理的图像

ksize:滤波核的大小,宽、高必须是奇数,例如(3,3)、(5,5)等。

sigmaX:卷积核水平方向的标准差

sigmaY:卷积核垂直方向的标准差。修改 sigmaX 或 sigmaY 的值都可以改变卷积核中的权重比例。如果不知道如何设计这两个参数值,就直接把这两个参数的值写成0,方法就会根据滤波核的大小自动计算出合适的权重比例。

boderType:可选参数,边界样式,建议使用默认值。

返回值说明:

dst:经过高斯滤波处理之后的图像

案例:

使用9×9的滤波核对图像进行高斯滤波操作,水平方向和垂直方向的标准差参数值全部为0,代码如下:

import cv2
img = cv2.imread("amygdalus triloba.jpg")  # 读取原图
dst1 = cv2.GaussianBlur(img, (9, 9), 0, 0)  # 使用大小为9*9的滤波核进行高斯滤波
cv2.imshow("img", img)  # 显示原图
cv2.imshow("9", dst1)  # 显示滤波效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

说明:♨️♨️♨️

和均值滤波、中值滤波处理的图像相比,高斯滤波处理的图像更加平滑,保留的图像信息更多,更容易辨认。 


🚀4.双边滤波器

不管是均值滤波、中值滤波还是高斯滤波,都会使整幅图像变得平滑,图像中的边界会变得模糊不清。双边滤波是一种在平滑处理过程中可以有效保护边界信息的滤波操作

双边滤波器会自动判断滤波核处于“平坦”区域还是“边缘”区域:如果滤波核处于“平坦”区域,则会使用类似高斯滤波的算法进行滤波;如果滤波核处于“边缘”区域,则加大“边缘”像素的权重,尽可能让这些像素值保持不变。

OpenCV将双边滤波器封装成了bilateralFilter()方法,其语法如下:

dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)

参数说明:

src:被处理的图像

d:以当前像素为中心的整个滤波区域的直径。如果是d<0,则自动根据 sigmaSpace 参数计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比。

sigmaColor:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值之差小于这个值时,周围的像素才会进行滤波计算。值为255时,表示所有颜色都参与计算。

sigmaSpace:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多。

borderType:可选参数,边界样式,建议默认。

返回值说明:

dst:经过双边滤波处理之后的图像

案例:

使用大小为(15,15)的滤波核对图像进行高斯滤波处理,同样使用15作为范围直径对图像进行双边滤波处理,观察两种滤波处理之后的图像边缘有什么差别,代码如下:

import cv2
img = cv2.imread("1.webp")  # 读取原图
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()  # 释放所有窗体

运行效果如图所示:

说明:♨️♨️♨️

由上面三张图对比可得,高斯滤波模糊了整个画面,但双边滤波保留了较清晰的边缘信息。


🚀5.总结

均值滤波器:中央像素取平均值,效果像马赛克。

中值滤波器:中央像素取排序后的中间值,效果像水彩画。

高斯滤波器:按照卷积核权重计算中央像素值,毛玻璃效果。

双边滤波器:保留边缘信息,边缘清晰。

相关文章:

OpenCV基础知识(6)— 滤波器

前言:Hello大家好,我是小哥谈。在尽量保留原图像信息的情况下,去除图像内噪声、降低细节层次信息等一系列过程,被叫做图像的平滑处理(或者叫图像的模糊处理)。实现平滑处理最常用的工具就是滤波器。通过调节…...

IOC容器的基础功能设计模式

构造模式 构造器的目的和构造函数一样,但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建,通过提供一大堆的api来丰富简化构造过程,增加调用者的体验。 构造者需要提供一个Build方法用于构建和返回将要构造的…...

FFmpeg参数说明FFmpegAndroid饺子视频播放器

FFmpegAndroid https://github.com/xufuji456/FFmpegAndroid https://github.com/lipangit/JiaoZiVideoPlayer/tree/develop 饺子视频播放器 ffmpeg 不是内部或外部命令,也不是可运行的程序 或批处理文件 http://www.360doc.com/content/21/0204/15/54508727_9606…...

DNS入门学习:DNS解析生效问题(中科三方)

在修改域名解析记录或DNS服务器之后,DNS解析并不会立即生效,这给很多网站管理者带来了很多困扰,了解DNS解析生效原理以及不同情况下DNS解析生效时间,对于网站管理工作有很大帮助。本文中科三方针对不同情况下DNS解析生效时间做下简…...

Ubuntu22.04编译安装Mysql5.7.35

新升级的ubuntu22.04版本,该版本默认openssl已经升级到3.0,所以编译过程遇到一些问题记录一下。 编译步骤: 安装依赖 gcc g已经安装过就不需要再安装了。 apt-get install cmake apt-get install libaio-dev apt-get install libncurses5…...

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道,c是一个一本正经的编程语言,因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧!! 音乐的好处 提升情绪:音乐能够影响我们…...

Django笔记之log日志记录详解

以下是一个简单的 logging 模块示例,可以先预览一下,接下来会详细介绍各个模块的具体功能: LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: %(levelname)s %(message)s,}},handlers: {file_1: {leve…...

vue局部打印多页面pdf

技术背景 html打印程pdf,使用的官方提供的window.print()打印的样式 media print {} 方法一 const printContent this.$refs.bodyright;var textInput printContent.getElementsByTagName("input");for (var i 0; i < textInput.length; i) {textInput[i].se…...

指定或降低Rust 工具链的版本

要更改 Rust 工具链的版本&#xff0c;您可以使用以下命令之一&#xff1a; rustup default stable&#xff1a;使用 stable 版本的 Rust 工具链作为默认版本。rustup default beta&#xff1a;使用 beta 版本的 Rust 工具链作为默认版本。rustup default nightly&#xff1a;使…...

数据驱动成功:商城小程序分析与改进

在当今数字化时代&#xff0c;商城小程序成为了企业与消费者之间互动的重要途径。然而&#xff0c;一个成功的商城小程序不仅仅是一个购物平台&#xff0c;更需要通过数据分析不断进行改进和优化&#xff0c;以提升用户体验和营销效果。本文将深入探讨如何利用数据驱动的方式进…...

基于GUI的卷积神经网络和长短期神经网络的语音识别系统,卷积神经网的原理,长短期神经网络的原理

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 长短期神经网络的原理 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期…...

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…...

【剖析STL】vector

vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是…...

Redis、Memcache和MongoDB的区别

>>Memcached Memcached的优点&#xff1a; Memcached可以利用多核优势&#xff0c;单实例吞吐量极高&#xff0c;可以达到几十万QPS&#xff08;取决于key、value的字节大小以及服务器硬件性能&#xff0c;日常环境中QPS高峰大约在4-6w左右&#xff09;。适用于最大程度…...

2023中大ACM游记

游记 中午快十二点时才到了广州六中&#xff0c;在附近吃了塔斯汀汉堡&#xff0c;味道还不错。 十二点半才卡点到了考场&#xff0c;本以为来晚了&#xff0c;但老师说比赛时间延迟&#xff0c;十二点五十才开场。 三个人用一台电脑&#xff0c;这种比赛方式还是第一次遇到…...

记一次线上OOM事故

OOM 问题 linux内核有个机制叫OOM killer(Out-Of-Memory killer)&#xff0c;当系统需要申请内存却申请不到时&#xff0c;OOM killer会检查当前进程中占用内存最大者&#xff0c;将其杀掉&#xff0c;腾出内存保障系统正常运行。 一般而言&#xff0c;一个应用的内存逐渐增加&…...

Learning to Super-resolve Dynamic Scenes for Neuromorphic Spike Camera论文笔记

摘要 脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流&#xff0c;以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率&#xff0c;致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题&#xff0c;这篇文章提出了Sp…...

怎么使用手机远程控制Win10电脑?

可以使用手机远程控制电脑吗&#xff1f; “近期&#xff0c;我将出差一段时间。问题是&#xff0c;我希望能够从很远的地方浏览家里电脑上的一些东西&#xff0c;但我不会一直随身携带笨重的笔记本电脑。我可以手机远程访问Windows电脑吗&#xff1f; ” 当然&am…...

W6100-EVB-PICO 做UDP Client 进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

Typora 相对路径保存图片以及 Gitee 无法显示图片

目录 Typora 相对路径保存图片 Gitee 无法显示图片 Typora 相对路径保存图片 Step1&#xff1a;修改 Typora 的偏好设置 自动在当前目录创建名为 "./${filename}.assets" 的文件夹粘贴图片到 md 中时&#xff0c;图片会自动另存到 "./${filename}.assets&qu…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...