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实现2014火车票查询代码分享
Jan 10 Python
使用Python编写类UNIX系统的命令行工具的教程
Apr 15 Python
django 多数据库配置教程
May 30 Python
Python面向对象之类和对象实例详解
Dec 10 Python
带你认识Django
Jan 15 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
详解python爬取弹幕与数据分析
Nov 14 Python
如何查看python关键字
Jan 17 Python
java关于string最常出现的面试题整理
Jan 18 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
javascript重写alert方法的实例代码
2013/03/29 Javascript
jQuery基础知识小结
2014/12/22 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
python的绘图工具matplotlib使用实例
2014/07/03 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python中取整的几种方法小结
2017/01/06 Python
python实现kNN算法
2017/12/20 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
详解python中sort排序使用
2019/03/23 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
2014年大学生自我评价
2014/01/19 职场文书
学校招生宣传广告词
2014/03/19 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android