Python OpenCV之常用滤波器使用详解


Posted in Python onApril 07, 2022

1. 滤波器

1.1 什么是滤波器

滤波器是对图像做平滑处理 的一种常用工具。

平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻近的像素值之间,值的大小趋于“平滑”,以去除图像内的噪声、降低细节层次信息等的一系列的操作过程。本篇blog将为大家展示OpenCV中的均值滤波器 、中值滤波器 、高斯滤波器 和 双边滤波器。

滤波器的算法逻辑为,指定一个滤波核的大小(该大小表示参与计算的像素数据的范围),以图像中的每一个像素都作为波的核心,通过该范围内的数据,以一定的计算方式进行计算,将计算结果该值赋值给该像素。

1.2 关于滤波核

以大小为n×n的滤波核为例,对于每一个像素数据,我们可以在数组中得到以一个像素为中心的n×n的矩阵,此即参与计算的数据的范围(边界)。这样的矩阵结构即被称为滤波核。

1.3 素材选择

使用图像《龙门石窟》(longmen.jpg) shape:(350, 600, 3)

Python OpenCV之常用滤波器使用详解

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()

滤波效果如下:

Python OpenCV之常用滤波器使用详解

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()

滤波效果如下:

Python OpenCV之常用滤波器使用详解

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()

Python OpenCV之常用滤波器使用详解

可以看出,滤波核大小越大,图像越趋于模糊。

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()

滤波后效果如下:

Python OpenCV之常用滤波器使用详解

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()

滤波后效果如下:

Python OpenCV之常用滤波器使用详解

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()

双边滤波效果如下:

Python OpenCV之常用滤波器使用详解

可以看出,相比以上滤波效果,双边滤波保留了较清晰的图像边缘信息。

到此这篇关于Python OpenCV之常用滤波器使用详解的文章就介绍到这了,更多相关Python OpenCV滤波器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中使用不同编码读写txt文件详解
May 28 Python
python编写简单爬虫资料汇总
Mar 22 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
Python实现Dijkstra算法
Oct 17 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Django DRF路由与扩展功能的实现
Jun 03 Python
Python 如何实现访问者模式
Jul 28 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
Flask response响应的具体使用
Jul 15 Python
python Tkinter模块使用方法详解
一行Python命令实现批量加水印
Apr 07 #Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
详解Python中*args和**kwargs的使用
Apr 07 #Python
Python列表的索引与切片
Apr 07 #Python
Python字符串的转义字符
Python字符串格式化方式
Apr 07 #Python
You might like
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
php自定义分页类完整实例
2015/12/25 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
Python复数属性和方法运算操作示例
2017/07/21 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
python speech模块的使用方法
2020/09/09 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
单位介绍信范文
2014/01/18 职场文书
民生工程实施方案
2014/03/22 职场文书
政治学求职信
2014/06/03 职场文书
工程项目经理任命书
2014/06/05 职场文书
2014年法院工作总结
2014/11/24 职场文书
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python