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 相关文章推荐
pygame学习笔记(6):完成一个简单的游戏
Apr 15 Python
Python的Django框架安装全攻略
Jul 15 Python
python中range()与xrange()用法分析
Sep 21 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
Python 单例设计模式用法实例分析
Sep 23 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
python对XML文件的操作实现代码
Mar 27 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
Python安装Bs4的多种方法
Nov 28 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 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在window iis的莫名问题的测试方法
2013/05/14 PHP
如何离线执行php任务
2017/02/21 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
python实现查询苹果手机维修进度
2015/03/16 Python
Python+Opencv识别两张相似图片
2020/03/23 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
Python如何获取文件路径/目录
2020/09/22 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
机关单位动员会主持词
2014/03/20 职场文书
作文评语大全
2014/04/23 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
2014年材料员工作总结
2014/11/19 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
会计求职自荐信
2015/03/26 职场文书
保外就医申请书范文
2015/08/06 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
2019教师的学习计划
2019/06/25 职场文书
Java基于字符界面的简易收银台
2021/06/26 Java/Android
golang语言指针操作
2022/04/14 Golang