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

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

1、sobel算子

sobel算子可用来检测边缘

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

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

2、roberts算子

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

调用格式也是一样的:

  1. edges = filters.roberts(img)

3、scharr算子

功能同sobel,调用格式:

  1. edges = filters.scharr(img)

4、prewitt算子

功能同sobel,调用格式:

  1. edges = filters.prewitt(img)

5、canny算子

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

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

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

  1. from skimage import data,filters,feature
  2. import matplotlib.pyplot as plt
  3. img = data.camera()
  4. edges1 = feature.canny(img) #sigma=1
  5. edges2 = feature.canny(img,sigma=3) #sigma=3
  6.  
  7. plt.figure('canny',figsize=(8,8))
  8. plt.subplot(121)
  9. plt.imshow(edges1,plt.cm.gray)
  10.  
  11. plt.subplot(122)
  12. plt.imshow(edges2,plt.cm.gray)
  13.  
  14. plt.show()

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

6、gabor滤波

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

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

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

  1. from skimage import data,filters
  2. import matplotlib.pyplot as plt
  3. img = data.camera()
  4. filt_real, filt_imag = filters.gabor_filter(img,frequency=0.6)
  5.  
  6. plt.figure('gabor',figsize=(8,8))
  7.  
  8. plt.subplot(121)
  9. plt.title('filt_real')
  10. plt.imshow(filt_real,plt.cm.gray)
  11.  
  12. plt.subplot(122)
  13. plt.title('filt-imag')
  14. plt.imshow(filt_imag,plt.cm.gray)
  15.  
  16. plt.show()

以上为frequency=0.6的结果图。

以上为frequency=0.1的结果图

7、gaussian滤波

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

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

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

  1. from skimage import data,filters
  2. import matplotlib.pyplot as plt
  3. img = data.astronaut()
  4. edges1 = filters.gaussian_filter(img,sigma=0.4) #sigma=0.4
  5. edges2 = filters.gaussian_filter(img,sigma=5) #sigma=5
  6.  
  7. plt.figure('gaussian',figsize=(8,8))
  8. plt.subplot(121)
  9. plt.imshow(edges1,plt.cm.gray)
  10.  
  11. plt.subplot(122)
  12. plt.imshow(edges2,plt.cm.gray)
  13.  
  14. plt.show()

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

8.median

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

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

  1. from skimage import data,filters
  2. import matplotlib.pyplot as plt
  3. from skimage.morphology import disk
  4. img = data.camera()
  5. edges1 = filters.median(img,disk(5))
  6. edges2= filters.median(img,disk(9))
  7.  
  8. plt.figure('median',figsize=(8,8))
  9.  
  10. plt.subplot(121)
  11. plt.imshow(edges1,plt.cm.gray)
  12.  
  13. plt.subplot(122)
  14. plt.imshow(edges2,plt.cm.gray)
  15.  
  16. plt.show()

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

9、水平、垂直边缘检测

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

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

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

  1. from skimage import data,filters
  2. import matplotlib.pyplot as plt
  3. img = data.camera()
  4. edges1 = filters.sobel_h(img)
  5. edges2 = filters.sobel_v(img)
  6.  
  7. plt.figure('sobel_v_h',figsize=(8,8))
  8.  
  9. plt.subplot(121)
  10. plt.imshow(edges1,plt.cm.gray)
  11.  
  12. plt.subplot(122)
  13. plt.imshow(edges2,plt.cm.gray)
  14.  
  15. plt.show()

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

10、交叉边缘检测

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

其中一个核:

  1. 0 1
  2. -1 0

对应的函数:

roberts_neg_diag(image)

例:

  1. from skimage import data,filters
  2. import matplotlib.pyplot as plt
  3. img =data.camera()
  4. dst =filters.roberts_neg_diag(img)
  5.  
  6. plt.figure('filters',figsize=(8,8))
  7. plt.subplot(121)
  8. plt.title('origin image')
  9. plt.imshow(img,plt.cm.gray)
  10.  
  11. plt.subplot(122)
  12. plt.title('filted image')
  13. plt.imshow(dst,plt.cm.gray)

另外一个核:

  1. 1 0
  2. 0 -1

对应函数为:

roberts_pos_diag(image)

  1. from skimage import data,filters
  2. import matplotlib.pyplot as plt
  3. img =data.camera()
  4. dst =filters.roberts_pos_diag(img)
  5.  
  6. plt.figure('filters',figsize=(8,8))
  7. plt.subplot(121)
  8. plt.title('origin image')
  9. plt.imshow(img,plt.cm.gray)
  10.  
  11. plt.subplot(122)
  12. plt.title('filted image')
  13. plt.imshow(dst,plt.cm.gray)

python数字图像处理(10):图像简单滤波的更多相关文章

  1. python数字图像处理(四) 频率域滤波

    import matplotlib.pyplot as plt import numpy as np import cv2 %matplotlib inline 首先读入这次需要使用的图像 img = ...

  2. python数字图像处理(17):边缘与轮廓

    在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...

  3. 「转」python数字图像处理(18):高级形态学处理

    python数字图像处理(18):高级形态学处理   形态学处理,除了最基本的膨胀.腐蚀.开/闭运算.黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等. 1.凸包 凸包是指一 ...

  4. Win8 Metro(C#) 数字图像处理--1 图像打开,保存

    原文:Win8 Metro(C#) 数字图像处理--1 图像打开,保存 作为本专栏的第一篇,必不可少的需要介绍一下图像的打开与保存,一便大家后面DEMO的制作.   Win8Metro编程中,图像相关 ...

  5. Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化  [函数名称] 简单统计法图像二值化 WriteableBitmap StatisticalThSegment(Wr ...

  6. python数字图像处理(1):环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  7. 初始----python数字图像处理--:环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  8. Win8 Metro(C#)数字图像处理--4图像颜色空间描述

    原文:Win8 Metro(C#)数字图像处理--4图像颜色空间描述  图像颜色空间是图像颜色集合的数学表示,本小节将针对几种常见颜色空间做个简单介绍. /// <summary> / ...

  9. python数字图像处理(五) 图像的退化和复原

    import cv2 import numpy as np import matplotlib.pyplot as plt import scipy import scipy.stats %matpl ...

随机推荐

  1. Java 参数传递都是值传递

    Java 参数传递都是值传递,验证代码如下 public class ParamTransferTest { public static void swap(int a, int b) { int t ...

  2. crontab 例行性排程

    那么我们就来聊一聊 crontab 的语法吧![root@www ~]# crontab [-u username] [-l|-e|-r]选项不参数:-u :只有 root 才能迚行这个仸务,亦即帮其 ...

  3. MYSQL数据库函数集合

    一.数学函数 ABS(x)   返回x的绝对值 BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x)   返回大于x的最小整数值 EXP(x)   返回值e( ...

  4. 公用表表达式(CTE)引发的改变执行顺序同WHERE条件顺序引发的bug

    以下模拟一下CTE出错 /*测试环境 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyr ...

  5. Oracle-创建服务器参数文件

    允许使用传统的init.ora或SPFILE作为配置文件.但是建议所有数据库创建和使用一个SPFILE.可以从init.ora创建SPFILE SQL> CREATE spfile FROM p ...

  6. cocos2d-x之物理引擎之碰撞监测

    #include "HelloWorldScene.h" USING_NS_CC; #define RED_BIT_MASK    0b0100 #define GREEN_BIT ...

  7. log4j日志优先级导致的不输出日志

    在sae部署微信代码的时候,发现它的默认日志很不友好,看起来很费劲,详细看了一下说明发现它可以根据log4j的输出级别而分类输出,就拖了一个log4j的xml文件扔进项目代码,然后部署运行,发现没有日 ...

  8. 搭建docker私有仓库,建立k8s集群

    服务器IP角色分布 192.168.5.2 etcd server 192.168.5.2 kubernetes master 192.168.5.3 kubernetes node 192.168. ...

  9. JAVASE笔记回顾

    第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ, ...

  10. codeforces 711A A. Bus to Udayland(水题)

    题目链接: A. Bus to Udayland 题意: 找一对空位坐下来,水; 思路: AC代码: #include <iostream> #include <cstdio> ...