Python OpenCV学习之图像滤波详解
作者:一个热爱学习的深度渣渣 发布时间:2021-09-17 18:49:36
背景
图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像;明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积;实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数;当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器;
一、卷积相关概念
卷积核大小一般为奇数的原因:
1、增加padding的原因;
2、保证锚点在中间,防止位置发生偏移;
卷积核大小的影响:卷积核越大,感受野越大,提取的特征越好,同时计算量也越大;
边界扩充(padding)作用:使得输出数据的尺寸与输入相等;
计算公式:
N = (W - F + 2P)/ S + 1
N:输出图像大小
W:原图大小
F:卷积核大小
P:扩充尺寸
S:步长大小
二、卷积实战
首先介绍两个简单的滤波:低通滤波与高通滤波;
低通滤波:低于阈值的可通过,去除噪音或平滑图像;
高通滤波:高于阈值的可 通过,用于边缘检测;
函数原型:
filter2D(src,ddepth,kernel,[anchor,delta,borderType])
ddepth:位深,一般设定为-1;
代码案例:
kernel = np.ones((5, 5), np.float32) / 25
result = cv2.filter2D(img, -1, kernel)
这是一个平均卷积,起到一个降噪的作用,但效果并不明显;
三、均值滤波
首先介绍一个方盒滤波,实际上就是全为1的卷积核乘以权重a;
函数原型:boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
说明:当normalize为True时,乘以1/W*H,也就是均值滤波,所以一般不用这个滤波函数;
均值滤波函数原型:blur(src,ksize,[anchor,borderType])
注意:一般均值滤波就是使用这个API;
代码案例:
result = cv2.blur(img, 5)
四、高斯滤波
原理:越靠近中心,权重越大,离中心越远,权重越小;
函数原型:
GaussianBlur(img,kernel,sigmaX,[sigmaY,…])
说明:对效果有影响的参数为kernel和sigmaX,这两者越大图像平滑(模糊)的效果会越明显;
代码案例:
gauss = cv2.imread('gaussian.png')
result = cv2.GaussianBlur(gauss, (5, 5), 5)
cv2.imshow('org', gauss)
cv2.imshow('result', result)
cv2.waitKey(0)
从图中可看出,处理后高斯噪点减少了,但整体图像也变模糊了;
五、中值滤波
本质:取中间值作为卷积结果;
作用:对胡椒噪音有很好的处理效果;
函数原型:
medianBlur(img,ksize)
代码案例:
img = cv2.imread('papper.png')
result = cv2.medianBlur(img, 5)
cv2.imshow('org', img)
cv2.imshow('result', result)
cv2.waitKey(0)
从上图可以看出,效果是相当不错的;
六、双边滤波
作用:可以保留边缘,同时对边缘内的区域进行平滑处理;(主要进行美颜)
函数原型:
bilateralFilter(img,d,sigmaColor,sigmaSpace)
案例代码:
img = cv2.imread('1.jpg')
result = cv2.bilateralFilter(img, 9, 50, 50)
cv2.imshow('org', img)
cv2.imshow('result', result)
cv2.waitKey(0)
从图中可以看出,美颜效果是比较明显的,并且对于边缘轮廓也处于能接受范围;
七、Sobel算子
上述介绍的几种滤波均为低通滤波,接下来介绍高通滤波,最主要作用是检测边缘;
实现步骤:
x轴方向求导 —— y轴方向求导 —— 最终结果为二者相加
函数原型:
Sobel(src,ddepth,dx,dy,ksize=3,…)
代码案例:
chess = cv2.imread('chess.png')
# 求y方向边缘
dy = cv2.Sobel(chess, cv2.CV_64F, 1, 0, ksize=5)
# 求x方向边缘
dx = cv2.Sobel(chess, cv2.CV_64F, 0, 1, ksize=5)
# 二者相加
result = dy + dx
cv2.imshow('chess', chess)
cv2.imshow('dy', dy)
cv2.imshow('dx', dx)
cv2.imshow('result', result)
cv2.waitKey(0)
从上图可以明显看出,当dx设置为1时,求得y方向上的边缘信息,反之也是,最终二者相加的结果也就是Sobel算子的结果。不能一开始就设定dx,dy为1,这样子不能达到该效果;
八、Scharr算子
定义:与Sobel类似,但使用的kernel值不同,并且只能为3x3,只能求x方向或y方向一个方向的边缘信息;
函数原型:
Scharr(src,ddepth,dx,dy)
在这里就不演示了,该算子不常用,主要优点是能检测到不明显的边缘,当Sobel的ksize设置为-1时等同;
九、拉普拉斯算子
优点:可同时求得两个方向的边缘;
缺点:对噪音比较敏感,一般需要先进行去噪在调用拉普拉斯算子;
函数原型:
Laplacian(img,ddepth,ksize=1)
代码案例:
chess = cv2.imread('chess.png')
result = cv2.Laplacian(chess, cv2.CV_64F, ksize=5)
cv2.imshow('chess', chess)
cv2.imshow('result', result)
cv2.waitKey(0)
从效果上看,比起Sobel步骤更加简单,并且效果也比较好,缺点就是如果噪声过多的话效果会比较差;
十、Canny算法
实现步骤:
1、使用5x5高斯滤波消除噪音;
2、使用Sobel计算图像梯度的方向(0°、45°、90°、135°);
3、取局部极大值;
4、阈值计算;
函数原型:
Canny(img,minVal,maxVal,…)
其中的minVal和maxVal代表边缘的阈值,两者差值过大的话会损失一定的边缘信息;
代码案例:
img = cv2.imread('1.jpg')
result = cv2.Canny(img, 100, 200)
cv2.imshow('org', img)
cv2.imshow('result', result)
cv2.waitKey(0)
来源:https://blog.csdn.net/weixin_40620310/article/details/122351049
猜你喜欢
- 受杰森的《Almost Looks Like Work》启发,我来展示一些病毒传播模型。需要注意的是这个模型并不反映现实情况,因此不要误以为
- 总有一些程序在windows平台表现不稳定,动不动一段时间就无响应,但又不得不用,每次都是发现问题了手动重启,现在写个脚本定时检测进程是否正
- 代码如下:--获取当前时间 Select getdate() --获取当前年月日 YY代表年,MM代表月,DD代表日,hh代表时
- lambda/filter/map/reduce这几个函数面试中很肯定会用到,本篇主要介绍这几个函数的用法。1 lambda匿名函数,用法如
- innerHTML,outerHTML innerHTML检索或设置标签内的内容;outerHTML检索或设置整个标签的内容(包含标签)。&
- 本文实例讲述了Python实现合并excel表格的方法。分享给大家供大家参考,具体如下:需求将一个文件夹中的excel表格合并成我们想要的形
- asp之日期和时间函数示例可以使用日期和时间函数来得到各种格式的日期和时间函数语法说明示例NowNow()取得系统当前的日期和
- 案例故事:百度网盘非会员大量上传文件,会弹出:“上传文件数量超出500个现在,开通超级会员后可继续上传”,其实是限制拖入500张相片,并非限
- 这篇文章主要介绍了Python读取表格类型文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 1.认识数组数组就是某类数据的集合,数据类型可以是整型、字符串、甚至是对象Javascript不支持多维数组,但是因为数组里面可以包含对象(
- 今天给大家分享一个简单的python脚本,使用python进行http的接口测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据
- 目录mapfilterreducezipsortedmapmap其中,function 参数表示要传入一个函数,其可以是内置函数、自定义函数
- 目录演示地址:关于程序开发环境资源和依赖包NASA TV feed 流Python第三方库完整代码演示地址:https://replit.c
- 小编想把用python将列表[1,1,1,1,1,1,1,1,1,1] 和 列表 [2,2,2,2,2,2,2,2,2,2]对应相加成[3,
- 图像处理工具——灰度直方图灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。例子:矩阵图片来自网络,侵删!上
- 正题: 1.1 javascript的灵活性 面向对象对象的Javascript编程模式:1、可以保存状态 2、具有对象内部才能调用的方法
- Go文档中展示了多种方式实现外部资源嵌入,包括文本文件、图片、ios文件等:文本文件package mainimport _ "e
- Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"
- 由于该math模块与 Python 版本一起打包,因此您不必单独安装它,直接导入:import mathmath模块常数Pythonmath
- 我不知道有多少人在使用浏览器的书签,这东东有时候实在是很有用的,比如现在说到的jQuerify书签。jQuerify书签的功能很简单,那就是