• python 图像处理(9):图像简单滤波


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

    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)

    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()
    复制代码

    从结果可以看出,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()
    复制代码

    以上为frequency=0.6的结果图。

    以上为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()
    复制代码

    可见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()
    复制代码

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

    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()
    复制代码

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

    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)
    复制代码

    另外一个核:

    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)
    复制代码

  • 相关阅读:
    怪异恼人的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream问题的解决
    Spring3的quartz定时任务
    HTML模板
    SpringMVC 下载XLS文档的设置
    若想在当前路径下去运行非当前路径下的.class文件(即java可执行文件),该如何操作?
    霍金去世 享年76岁
    Github全面学习笔记
    Github上如何在Fork到的开源项目中提交Pull requests?
    Github中如何Fork开源项目?
    Java永久代去哪儿了
  • 原文地址:https://www.cnblogs.com/presleyren/p/14708443.html
Copyright © 2020-2023  润新知