Python OpenCV之常用滤波器使用详解
作者:侯小啾 发布时间:2023-02-07 22:18:25
1. 滤波器
1.1 什么是滤波器
滤波器是对图像做平滑处理 的一种常用工具。
平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻近的像素值之间,值的大小趋于“平滑”,以去除图像内的噪声、降低细节层次信息等的一系列的操作过程。本篇blog将为大家展示OpenCV中的均值滤波器 、中值滤波器 、高斯滤波器 和 双边滤波器。
滤波器的算法逻辑为,指定一个滤波核的大小(该大小表示参与计算的像素数据的范围),以图像中的每一个像素都作为波的核心,通过该范围内的数据,以一定的计算方式进行计算,将计算结果该值赋值给该像素。
1.2 关于滤波核
以大小为n×n的滤波核为例,对于每一个像素数据,我们可以在数组中得到以一个像素为中心的n×n的矩阵,此即参与计算的数据的范围(边界)。这样的矩阵结构即被称为滤波核。
1.3 素材选择
使用图像《龙门石窟》(longmen.jpg) shape:(350, 600, 3)
2.均值滤波器 cv2.blur()
2.1 语法简介
均值滤波器,也称低通滤波器
顾名思义,均值滤波器即对滤波核内的数据求均值,然后将这个值赋值给矩阵核心位置。
均值滤波器可以使用cv2.blur() 方法实现
cv2.blur()的语法:
dst = blur(src, ksize, dst=None, anchor=None, borderType=None)
其中
scr 即图像
ksize 滤波核大小。使用一个元组表示,形如(a, b),a表示height(高度),b表示width(宽度)。
anchor 波核锚点
borderType 边界类型
下边以3×3,5×5,10×10三种滤波核为例,分别展示图像经过均值滤波器处理后的效果。
2.2 代码示例
2.2.1 3×3 滤波核为例
import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.blur(img, (3, 3))
cv2.imshow("3*3", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
滤波效果如下:
2.2.2 5×5 滤波核为例
import cv2
img = cv2.imread("longmen.jpg")
dst2 = cv2.blur(img, (5, 5))
cv2.imshow("5*5", dst2)
cv2.waitKey()
cv2.destroyAllWindows()
滤波效果如下:
2.2.3 10×10滤波核为例
import cv2
img = cv2.imread("longmen.jpg")
dst3 = cv2.blur(img, (10, 10))
cv2.imshow("10*10", dst3)
cv2.waitKey()
cv2.destroyAllWindows()
可以看出,滤波核大小越大,图像越趋于模糊。
3. 中值滤波器 cv2.medianBlur()
中值滤波器,即对滤波核内所有数据排序,将中间值赋值给滤波核核心位置的数字。
medianBlur(src, ksize, dst=None)
其中 ksize必须是奇数,是偶数的话会发生报错。
不同于均值滤波器的方法,cv2.blur(),cv2.blur()的ksize参数是一个元组,而cv2.blur()的ksize参数是一个数值。
代码示例
import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.medianBlur(img, 3)
cv2.imshow("3*3", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
滤波后效果如下:
4. 高斯滤波器 cv2.GaussianBlur()
高斯滤波器也被称为高斯模糊 或 高斯平滑 。
高斯滤波器可以在降低图片噪声、细节层次的同时保留更多的图像信息,使经过处理的图像呈现出“磨砂玻璃”的滤镜效果。
使用均值滤波时,每个像素都是均等权重的。使用高斯滤波器求的是不同权重下的均值,越靠近核心的像素的权重越大,约靠近边缘的像素的权重则越小。
与滤波核对应的由每个数据权重组成的矩阵结构,是一个卷积核。卷积核中所有权重值的和为1。卷积核中的数值会随着核的大小而变化。
OpenCV使用cv2.GaussianBlur()方法实现高斯滤波器。其语法如下:
GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
其中
src 为目标图像
ksize 是滤波核大小,宽高必须是奇数 。格式为是元组形式。
修改sigmaX 和 sigmaY都会改变卷积核中的权重值。这里涉及卷积方面的知识。
borderType 是边界类型。
以9×9的滤波核为例
import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.GaussianBlur(img, (9, 9), 0, 0)
cv2.imshow("9*9", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
滤波后效果如下:
5. 双边滤波器 cv2.bilateralFilter()
前三种滤波方式都会使图像变得平滑的同时,边缘区域变得模糊不清。
双边滤波是可以在滤波过程中起到保护图像边界信息作用的滤波操作方法。
其逻辑为:
如果图像在边缘区域,则加大边缘像素的权重,尽可能地让边缘区域的像素值保持不变。如果不在边缘区域(在平坦区域),则使用类似高斯滤波器的算法进行。
双边滤波器的语法为:
bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
scr 即目标图像
d过滤期间使用的每个像素邻域的直径。如果为非正,则根据sigmaSpace计算。即如果为15,则表示15×15的滤波核。
sigmaColor参与计算的颜色的范围,只有像素小于这个值时,以其为核心的滤波核才参与滤波计算。否则不参与。当sigmaColor值为255时,表示所有像素值为核心的滤波核都会参与。
sigmaSpace坐标空间的σ \sigmaσ值,σ \sigmaσ越大,参与计算的像素数量就越多。
borderType边界的样式。
还以图片"longmen.jpg"为例,
选择20×20的滤波核,
参与计算的像素值范围为:小于125的像素值;
坐标空间的σ \sigmaσ值为,200
import cv2
img = cv2.imread("longmen.jpg")
# 双边滤波,选取范围直径为15,颜色范围为125
dst = cv2.bilateralFilter(img, 15, 125, 200)
cv2.imshow("bilateral", dst)
cv2.waitKey()
cv2.destroyAllWindows()
双边滤波效果如下:
可以看出,相比以上滤波效果,双边滤波保留了较清晰的图像边缘信息。
来源:https://blog.csdn.net/weixin_48964486/article/details/123851477


猜你喜欢
- 利用channel进行模拟令牌桶对访问进行限流func FW(max int,duration time.Duration){//定义一个c
- 学习器在测试集上的误差我们通常称作“泛化误差”。要想得到“泛化误差”首先得将数据集划分为训练集和测试集。那么怎么划分呢?常用的方法有两种,k
- 一.下载安装包1.安装网址https://www.jetbrains.com/pycharm/2.在导航栏输入网址回车3.点击 DOWNLO
- 本文实例讲述了python使用pil生成缩略图的方法。分享给大家供大家参考。具体分析如下:这段代码实现python通过pil生成缩略图的功能
- 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
- 一、pycharm字体放大的设置File —>setting —> Keymap —>在搜寻框中输入increase —&
- 简介:使用python的过程中肯定少不了读取文件的操作,传统的形式是使用 直接打开、然后在操作、然后再关闭,这样代码量稍微大些不说,一旦在操
- 语法糖内的defineProps及defineEmits1、defineProps获取组件传值<div :style="fo
- PHP convert_cyr_string() 函数实例把字符串由一种字符集转换成另一种:<?php $str = "He
- 阅读上一篇:FrontPage XP设计教程3——网页的布局 FrontPage XP可以保证用户设计网页与不同的浏览器兼容,它所提供的样式
- 本文实例为大家分享了JS实现倒计时图文效果的具体代码,供大家参考,具体内容如下<body><img src="i
- mysql limit 分页的用法及注意事项:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,my
- 使用JS对Json数据的处理,项目遇到需要对Json数据进行相关操作,比如增删改操作,本以为会比较难,网上搜索下,发现还是比较简单的,贴一段
- 一、c++调用Python将Python安装目录下的include和libs文件夹引入到项目中,将libs目录下的python37.lib复
- 支持聚合函数的方法:提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用这些聚合函数,就
- 从url中找到域名,首先想到的是用正则,然后寻找相应的类库。用正则解析有很多不完备的地方,url中有域名,域名后缀一直在不断增加等。通过go
- swoole —— 重新定义PHPswoole 的进程之间有两种通信方式,一种是消息队列(queue),另一种是管道(pipe),对swoo
- 一、图像缩略图的编辑图像的缩略图是指把图像按原比例缩小,可作为原图的预览,这在网络速度比较慢时可快速地显示图片的概图。当你的网页上有大型图片
- //根据用户分组会话select t.USERNAME,count(*) from v$session t group by t.USERN
- 1、replicate_do_db 和 replicate_ignore_db 不要同时出现。容易出现混淆。也是毫无意义的。 Replica