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

news2024/9/22 7:33:25

前言: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.总结

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

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

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

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

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

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

相关文章

对容器、虚拟机和 Docker 的初学者友好介绍

一、说明 如果你是一个程序员或技术人员,你可能至少听说过Docker:一个有用的工具,用于在“容器”中打包,运输和运行应用程序。很难不这样做,这些天它得到了所有的关注 - 来自开发人员和系统管理员。即使是像谷歌、VMwa…

idea gerrit 插件使用指引

IDEA安装gerrit插件 在线安装(推荐) 直接搜索gerrit,安装即可离线安装 可以到github下载离线包:https://github.com/uwolfer/gerrit-intellij-plugin/releases,不过可能会有版本不兼容问题,还是推荐在线安装…

完美版积分商城系统-奇偶商城系统源码+独立代理后台

奇偶商城系统源码 完美版独立代理后台 1.演示环境:Linux Centos7以上版本 宝塔 2.Nginx 1.18.0 PHP7.0 Mysql5.6 3.伪静态选择thinkphp 4./Application/Common/Conf 修改数据库信息 详细搭建教程附在压缩包内了,下载查看

信号量

信号量(semaphore)和信号只有一字之差,却是不同的概念,信号量与之前介绍的IPC不同,它是一个计数器,用于实现进程间的互斥于同步 本文参考: Linux 的信号量_linux 信号量_行孤、的博客-CSDN博客 …

常见的 Python 错误及其解决方案

此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明:无效的语法是最常见的错误之一,通常是由于编写代码时违反了 Python 的语法规则。可能的原因: 忘记在 if、while、for 等语句后写冒号,或者…

perl下载与安装教程【工具使用】

Perl是一个高阶程式语言,由 Larry Wall和其他许多人所写,融合了许多语言的特性。它主要是由无所不在的 C语言,其次由 sed、awk,UNIX shell 和至少十数种其他的工具和语言所演化而来。Perl对 process、档案,和文字有很强…

GAN!生成对抗网络GAN全维度介绍与实战

目录 一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2 数学背景2.2.1 损失函数生成器损失判别器损失 2.2.2 优化方法优化代…

windows批处理set命令:设置变量,计算表达式

文章目录 基础模式表达式模式变量输入模式环境变量 基础模式 变量是一切编程的基础,在批处理语言中,通过set设置变量,而在调用变量时,需要在变量两端加上百分号,例如 set a1 echo %a%运行结果为 >set a1 >ech…

离市区太远的高铁站,导致旅客舍弃高铁而转用其他交通工具

随着高铁网络的完善,如今旅客出行越来越多选择快速、便捷的高铁作为出行交通工具,不过旅客显然也对一些城市的高铁站离市区太远有所抱怨,导致不少消费者选择舍弃高铁而转用其他交通工具。 网上有一份高铁站离市区距离的排名,据悉离…

Linux Xshell常用命令

一、查看服务器信息 1.1、查看CentOS服务器版本号 执行以下命令 cat /etc/redhat-release结果如下: 1.2、查看服务器根目录下空间占用情况 执行以下命令 cd / du -h --max-depth1 |grep G |sort参数说明: –max-depth1 最大深度为1 grep ‘G’ 文…

JavaScript中的this关键字的作用,以及它如何确定其值

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ this关键字的作用⭐ this的值取决于执行上下文⭐ 示例⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这…

Linux常用命令——dig命令

在线Linux命令查询工具 dig 域名查询工具 补充说明 dig命令是常用的域名查询工具&#xff0c;可以用来测试域名系统工作是否正常。 语法 dig(选项)(参数)选项 <服务器地址>&#xff1a;指定进行域名解析的域名服务器&#xff1b; -b<ip地址>&#xff1a;当主…

探秘Maven神奇力量:使用systemPath加载外部JAR包

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 探秘Maven神奇力量&#xff1a;使用systemPath加载外部JAR包 ⏱️ 创作…

攻防世界-ics-06

原题解题思路 看着页面多&#xff0c;其实只有报表中心能够跳转&#xff0c;但是选了确定后没反应&#xff0c;应该不是注入&#xff0c;只有id会变化。 在burp中设置好负载进行爆破 有一个长度与众不同的包 打开发现flag。

攻防世界-simple_php

原题 解题思路 flag被分成了两个部分&#xff1a;flag2&#xff0c;flag2。获得flag1需要满足变量a0且变量a≠0&#xff0c;这看起来不能实现&#xff0c;但实际上当变量a的值是字符时&#xff0c;与数字比较会发生强制类型转换&#xff0c;所以a为字符型数据即可&#xff0c;变…

STP生成树总结

一、什么是STP&#xff08;802.1D&#xff09; STP协议生来就是为了冗余而存在的&#xff0c;单纯树型的网络无法提供足够的可靠性&#xff0c;由此我们引入了额外的链路&#xff0c;这才出现了环路这样的问题。但单纯是标准的802.1D STP协议并不能实现真正的冗余与负载…

Threejs学习05——球缓冲几何体背景贴图和环境贴图

实现随机多个三角形随机位置随机颜色展示效果 这是一个非常简单基础的threejs的学习应用&#xff01;本节主要学习的是球面缓冲几何体的贴图部分&#xff0c;这里有环境贴图以及背景贴图&#xff0c;这样可以有一种身临其境的效果&#xff01;这里环境贴图用的是一个.hdr的文件…

openGauss学习笔记-45 openGauss 高级数据管理-物化视图

文章目录 openGauss学习笔记-45 openGauss 高级数据管理-物化视图45.1 全量物化视图45.1.1 全量物化视图语法格式45.1.2 全量物化视图参数说明45.1.3 全量物化视图示例 45.2 增量物化视图45.2.1 增量物化视图语法格式45.2.2 增量物化视图参数说明45.2.3 增量物化视图示例 openG…

Rest学习环境搭建:服务消费者

建一个子模块 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

浅析Linux SCSI子系统:调试方法

文章目录 SCSI日志调试功能scsi_logging_level调整SCSI日志等级 SCSI trace events使能SCSI trace events方式一&#xff1a;通过set_event接口方式二&#xff1a;通过enable 跟踪trace信息 相关参考 SCSI日志调试功能 SCSI子系统支持内核选项CONFIG_SCSI_LOGGING配置日志调试…