zoukankan      html  css  js  c++  java
  • python 图像处理(12):基本形态学滤波

    对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。

    1、膨胀(dilation)

    原理:一般对二值图像进行操作。找到像素值为1的点,将它的邻近像素点都设置成这个值。1值表示白,0值表示黑,因此膨胀操作可以扩大白色值范围,压缩黑色值范围。一般用来扩充边缘或填充小的孔洞。

    功能函数:skimage.morphology.dilation(imageselem=None)

    selem表示结构元素,用于设定局部区域的形状和大小。

    复制代码
    from skimage import data
    import skimage.morphology as sm
    import matplotlib.pyplot as plt
    img=data.checkerboard()
    dst1=sm.dilation(img,sm.square(5))  #用边长为5的正方形滤波器进行膨胀滤波
    dst2=sm.dilation(img,sm.square(15))  #用边长为15的正方形滤波器进行膨胀滤波
    
    plt.figure('morphology',figsize=(8,8))
    plt.subplot(131)
    plt.title('origin image')
    plt.imshow(img,plt.cm.gray)
    
    plt.subplot(132)
    plt.title('morphological image')
    plt.imshow(dst1,plt.cm.gray)
    
    plt.subplot(133)
    plt.title('morphological image')
    plt.imshow(dst2,plt.cm.gray)
    复制代码

    分别用边长为5或15的正方形滤波器对棋盘图片进行膨胀操作,结果如下:

    可见滤波器的大小,对操作结果的影响非常大。一般设置为奇数。

    除了正方形的滤波器外,滤波器的形状还有一些,现列举如下:

    morphology.square: 正方形

    morphology.disk:  平面圆形

    morphology.ball: 球形

    morphology.cube: 立方体形

    morphology.diamond: 钻石形

    morphology.rectangle: 矩形

    morphology.star: 星形

    morphology.octagon: 八角形

    morphology.octahedron: 八面体

    注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

    skimage.morphology.binary_dilation(image, selem=None)

    用此函数比处理灰度图像要快。

    2、腐蚀(erosion)

    函数:skimage.morphology.erosion(imageselem=None)

    selem表示结构元素,用于设定局部区域的形状和大小。

    和膨胀相反的操作,将0值扩充到邻近像素。扩大黑色部分,减小白色部分。可用来提取骨干信息,去掉毛刺,去掉孤立的像素。

    复制代码
    from skimage import data
    import skimage.morphology as sm
    import matplotlib.pyplot as plt
    img=data.checkerboard()
    dst1=sm.erosion(img,sm.square(5))  #用边长为5的正方形滤波器进行膨胀滤波
    dst2=sm.erosion(img,sm.square(25))  #用边长为25的正方形滤波器进行膨胀滤波
    
    plt.figure('morphology',figsize=(8,8))
    plt.subplot(131)
    plt.title('origin image')
    plt.imshow(img,plt.cm.gray)
    
    plt.subplot(132)
    plt.title('morphological image')
    plt.imshow(dst1,plt.cm.gray)
    
    plt.subplot(133)
    plt.title('morphological image')
    plt.imshow(dst2,plt.cm.gray)
    复制代码

    注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

    skimage.morphology.binary_erosion(image, selem=None)

    用此函数比处理灰度图像要快。

    3、开运算(opening)

    函数:skimage.morphology.openning(imageselem=None)

    selem表示结构元素,用于设定局部区域的形状和大小。

    先腐蚀再膨胀,可以消除小物体或小斑块。

    复制代码
    from skimage import io,color
    import skimage.morphology as sm
    import matplotlib.pyplot as plt
    img=color.rgb2gray(io.imread('d:/pic/mor.png'))
    dst=sm.opening(img,sm.disk(9))  #用边长为9的圆形滤波器进行膨胀滤波
    
    plt.figure('morphology',figsize=(8,8))
    plt.subplot(121)
    plt.title('origin image')
    plt.imshow(img,plt.cm.gray)
    plt.axis('off')
    
    plt.subplot(122)
    plt.title('morphological image')
    plt.imshow(dst,plt.cm.gray)
    plt.axis('off')
    复制代码

    注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

    skimage.morphology.binary_opening(image, selem=None)

    用此函数比处理灰度图像要快。

    4、闭运算(closing)

    函数:skimage.morphology.closing(imageselem=None)

    selem表示结构元素,用于设定局部区域的形状和大小。

    先膨胀再腐蚀,可用来填充孔洞。

    复制代码
    from skimage import io,color
    import skimage.morphology as sm
    import matplotlib.pyplot as plt
    img=color.rgb2gray(io.imread('d:/pic/mor.png'))
    dst=sm.closing(img,sm.disk(9))  #用边长为5的圆形滤波器进行膨胀滤波
    
    plt.figure('morphology',figsize=(8,8))
    plt.subplot(121)
    plt.title('origin image')
    plt.imshow(img,plt.cm.gray)
    plt.axis('off')
    
    plt.subplot(122)
    plt.title('morphological image')
    plt.imshow(dst,plt.cm.gray)
    plt.axis('off')
    复制代码

    注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

    skimage.morphology.binary_closing(image, selem=None)

    用此函数比处理灰度图像要快。

    5、白帽(white-tophat)

    函数:skimage.morphology.white_tophat(imageselem=None)

    selem表示结构元素,用于设定局部区域的形状和大小。

    将原图像减去它的开运算值,返回比结构化元素小的白点

    复制代码
    from skimage import io,color
    import skimage.morphology as sm
    import matplotlib.pyplot as plt
    img=color.rgb2gray(io.imread('d:/pic/mor.png'))
    dst=sm.white_tophat(img,sm.square(21))  
    
    plt.figure('morphology',figsize=(8,8))
    plt.subplot(121)
    plt.title('origin image')
    plt.imshow(img,plt.cm.gray)
    plt.axis('off')
    
    plt.subplot(122)
    plt.title('morphological image')
    plt.imshow(dst,plt.cm.gray)
    plt.axis('off')
    复制代码

    6、黑帽(black-tophat)

    函数:skimage.morphology.black_tophat(imageselem=None)

    selem表示结构元素,用于设定局部区域的形状和大小。

    将原图像减去它的闭运算值,返回比结构化元素小的黑点,且将这些黑点反色。

    复制代码
    from skimage import io,color
    import skimage.morphology as sm
    import matplotlib.pyplot as plt
    img=color.rgb2gray(io.imread('d:/pic/mor.png'))
    dst=sm.black_tophat(img,sm.square(21))  
    
    plt.figure('morphology',figsize=(8,8))
    plt.subplot(121)
    plt.title('origin image')
    plt.imshow(img,plt.cm.gray)
    plt.axis('off')
    
    plt.subplot(122)
    plt.title('morphological image')
    plt.imshow(dst,plt.cm.gray)
    plt.axis('off')
    复制代码

  • 相关阅读:
    java基础(8)---接口和lambda
    asp.net ashx处理程序中switch case的替代方案总结
    C# 委托(delegate)、泛型委托和Lambda表达式
    js判断浏览器是否安装或启用了flash的方法总结
    ASP.NET登录验证码解决方案
    C#读取匿名对象的属性值的方法总结
    C#中char[]与string之间的转换;byte[]与string之间的转化
    【Sublime】Sublime 常用插件
    js ajax设置和获取自定义header信息的方法总结
    .Net 通过设置Access-Control-Allow-Origin来实现跨域访问
  • 原文地址:https://www.cnblogs.com/presleyren/p/14708452.html
Copyright © 2011-2022 走看看