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中的线程同步方法
Jun 14 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
Python2随机数列生成器简单实例
Sep 04 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Python实现钉钉订阅消息功能
Jan 14 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
python 离散点图画法的实现
Apr 01 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 COOKIE设置为浏览器进程
2009/06/21 PHP
drupal 代码实现URL重写
2011/05/04 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
Python+django实现简单的文件上传
2016/08/17 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Python partial函数原理及用法解析
2019/12/11 Python
Python timeit模块的使用实践
2020/01/13 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
Python类的继承super相关原理解析
2020/10/22 Python
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
什么是数据抽象
2016/11/26 面试题
英智兴达软件测试笔试题
2016/10/12 面试题
税务会计岗位职责
2014/02/18 职场文书
代领毕业证委托书
2014/08/02 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL