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


猜你喜欢
- 之前也写过这个小组件,最近遇到select下加搜索的功能,所以稍微完善一下。效果图:子组件 dropdown.vue<template
- 五种Python下划线模式速查表:单前导下划线:_var当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提
- 1、手上目前拥有数据集是一大坨,没有train,test,val的划分如图所示2、目录结构:|---data |
- DDP 数据shuffle 的设置使用DDP要给dataloader传入sampler参数(torch.utils.data.distrib
- 如下所示:#!/usr/bin/env python3.5import psutilimport mysql.connectorimport
- plt.title() 是 matplotlib 库中用于设置图形标题的函数。一、基本语法如下plt.title(label, fontdi
- 本文实例为大家分享了vue iview动态新增和删除的具体代码,供大家参考,具体内容如下<Form ref="capsule
- 动态语言与静态语言有很多不同,最大的特性之一就是可以实现动态的对类和实例进行修改,在Python中,我们创建了一个类后可以对实例和类绑定心的
- 学在前面上篇 OpenCV 博客原计划完成一个 识别银行卡号 的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,
- 一、数据地址实体抽取的目的及问题对数据的地址进行实体识别,主要作用是确定我们的数据主体最终可以归到哪一行政单位,从而在各行政单位上对数据主体
- 安 * oostpython调用C/C++的方法有很多,本文使用boost.python。考虑到后期有好多在boost上的开发工作,所以boo
- 在使用DB2以来,碰到了几次出现提示SQL1032N错误,每次出错时出错信息大概如下:11/21/2004 22:15:33 0 0 SQL
- 这几天看了篇叫"Penetration: from application down to OS (Oracle)"的文
- 本文实例讲述了Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法。分享给大家供大家参考。具体实现方法如下:# 这里将一个
- 一、简介简单记录一下存储过程的使用。存储过程是预编译SQL语句集合,也可以包含一些逻辑语句,而且当第一次调用存储过程时,被调用的存储过程会放
- 在开发django应用的过程中,使用开发者模式启动服务是特别方便的一件事,只需要 python manage.py runserver 就可
- js代码如下: <script type="text/javascript"> //禁用右键菜单 docum
- 自从接触了python,再到机器学习和深度学习,要学习的东西向越拉越多了!!!因为课题的需要接触了tensorflow,我直接就是一个好家伙
- 本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下1、解释一下 WSGI 和 FastCGI
- gjsonGJSON 是一个Go包,它提供了一种从json文档中获取值的快速简单的方法。它具有单行检索、点符号路径、迭代和解析 json 行