python数字图像处理:图像简单滤波


Posted in Python onJune 28, 2022

对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声;另一种是微分算子,可以用来检测边缘和特征提取。

skimage库中通过filters模块进行滤波操作。

1、sobel算子

sobel算子可用来检测边缘

函数格式为:skimage.filters.sobel(imagemask=None)

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.camera()
edges = filters.sobel(img)
plt.imshow(edges,plt.cm.gray)

python数字图像处理:图像简单滤波

2、roberts算子

roberts算子和sobel算子一样,用于检测边缘

调用格式也是一样的:

edges = filters.roberts(img)

3、scharr算子

功能同sobel,调用格式:

edges = filters.scharr(img)

4、prewitt算子

功能同sobel,调用格式:

edges = filters.prewitt(img)

5、canny算子

canny算子也是用于提取边缘特征,但它不是放在filters模块,而是放在feature模块

函数格式:skimage.feature.canny(image,sigma=1.0)

可以修改sigma的值来调整效果

from skimage import data,filters,feature
import matplotlib.pyplot as plt
img = data.camera()
edges1 = feature.canny(img)   #sigma=1
edges2 = feature.canny(img,sigma=3)   #sigma=3

plt.figure('canny',figsize=(8,8))
plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  

plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)

plt.show()

python数字图像处理:图像简单滤波

从结果可以看出,sigma越小,边缘线条越细小。

6、gabor滤波

gabor滤波可用来进行边缘检测和纹理特征提取。

函数调用格式:skimage.filters.gabor_filter(imagefrequency)

通过修改frequency值来调整滤波效果,返回一对边缘结果,一个是用真实滤波核的滤波结果,一个是想象的滤波核的滤波结果。

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.camera()
filt_real, filt_imag = filters.gabor_filter(img,frequency=0.6)   

plt.figure('gabor',figsize=(8,8))

plt.subplot(121)
plt.title('filt_real')
plt.imshow(filt_real,plt.cm.gray)  

plt.subplot(122)
plt.title('filt-imag')
plt.imshow(filt_imag,plt.cm.gray)

plt.show()

python数字图像处理:图像简单滤波

以上为frequency=0.6的结果图。

python数字图像处理:图像简单滤波

以上为frequency=0.1的结果图

7、gaussian滤波

多维的滤波器,是一种平滑滤波,可以消除高斯噪声。

调用函数为:skimage.filters.gaussian_filter(imagesigma)

通过调节sigma的值来调整滤波效果

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.astronaut()
edges1 = filters.gaussian_filter(img,sigma=0.4)   #sigma=0.4
edges2 = filters.gaussian_filter(img,sigma=5)   #sigma=5

plt.figure('gaussian',figsize=(8,8))
plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  

plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)

plt.show()

python数字图像处理:图像简单滤波

可见sigma越大,过滤后的图像越模糊

8.median

中值滤波,一种平滑滤波,可以消除噪声。

需要用skimage.morphology模块来设置滤波器的形状。

from skimage import data,filters
import matplotlib.pyplot as plt
from skimage.morphology import disk
img = data.camera()
edges1 = filters.median(img,disk(5))
edges2= filters.median(img,disk(9))

plt.figure('median',figsize=(8,8))

plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  

plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)

plt.show()

python数字图像处理:图像简单滤波

从结果可以看出,滤波器越大,图像越模糊。

9、水平、垂直边缘检测

上边所举的例子都是进行全部边缘检测,有些时候我们只需要检测水平边缘,或垂直边缘,就可用下面的方法。

水平边缘检测:sobel_h, prewitt_h, scharr_h

垂直边缘检测: sobel_v, prewitt_v, scharr_v

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.camera()
edges1 = filters.sobel_h(img)  
edges2 = filters.sobel_v(img) 

plt.figure('sobel_v_h',figsize=(8,8))

plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  

plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)

plt.show()

python数字图像处理:图像简单滤波

上边左图为检测出的水平边缘,右图为检测出的垂直边缘。

10、交叉边缘检测

可使用Roberts的十字交叉核来进行过滤,以达到检测交叉边缘的目的。这些交叉边缘实际上是梯度在某个方向上的一个分量。

其中一个核:

 0   1
-1   0

对应的函数:

roberts_neg_diag(image)

 例:

from skimage import data,filters
import matplotlib.pyplot as plt
img =data.camera()
dst =filters.roberts_neg_diag(img) 

plt.figure('filters',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)

plt.subplot(122)
plt.title('filted image')
plt.imshow(dst,plt.cm.gray)

python数字图像处理:图像简单滤波

另外一个核:

1   0
0  -1

对应函数为:

roberts_pos_diag(image)

from skimage import data,filters
import matplotlib.pyplot as plt
img =data.camera()
dst =filters.roberts_pos_diag(img) 

plt.figure('filters',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)

plt.subplot(122)
plt.title('filted image')
plt.imshow(dst,plt.cm.gray)

python数字图像处理:图像简单滤波

Python 相关文章推荐
Python修改Excel数据的实例代码
Nov 01 Python
Python中Collection的使用小技巧
Aug 18 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
python如何通过protobuf实现rpc
Mar 06 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
Python numpy 点数组去重的实例
Apr 18 Python
TensorFlow的权值更新方法
Jun 14 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
python怎么对数字进行过滤
Jul 05 Python
python实现一个简单的贪吃蛇游戏附代码
python数字图像处理之对比度与亮度调整示例
Jun 28 #Python
python数字图像处理实现图像的形变与缩放
在python中读取和写入CSV文件详情
Jun 28 #Python
python数字图像处理之图像的批量处理
如何利用python实现Simhash算法
Jun 28 #Python
python数字图像处理:图像的绘制
You might like
福利彩票幸运号码自动生成器
2006/10/09 PHP
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
python滑块验证码的破解实现
2019/11/10 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
护士检查书
2014/01/17 职场文书
教师职称自我鉴定
2014/02/12 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
2014年学习部工作总结
2014/11/12 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
监理中标通知书
2015/04/16 职场文书
军事理论课感想
2015/08/11 职场文书
2016年寒假家长评语
2015/10/10 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis