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实现周期性抓取网页内容的方法
Nov 04 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
python计算两个地址之间的距离方法
Jun 09 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
python 标准差计算的实现(std)
Jul 29 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
Python使用re模块验证危险字符
May 21 Python
Python通过format函数格式化显示值
Oct 17 Python
python 制作简单的音乐播放器
Nov 25 Python
在Python中如何使用yield
Jun 07 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如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
js单例模式的两种方案
2013/10/22 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
基于javascript实现随机颜色变化效果
2016/01/14 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
浅谈React高阶组件
2018/03/28 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
python链表类中获取元素实例方法
2021/02/23 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
精神文明建设标语
2014/06/16 职场文书
寻找成龙观后感
2015/06/12 职场文书
js作用域及作用域链工作引擎
2022/07/07 Javascript