• 骨架提取(skeleton)- 二值图像细化


    # 骨架提取-skeleton
    # 骨架提取属于形态学处理范畴,放在skimage.morphology子模块内
    
    # 骨架提取,也叫二值图像细化。将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示。
    # skimage.morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize()函数和medial_axis()函数。
    
    ## skimage.morphology.skeletonize(image)
    # 格式为:skimage.morphology.skeletonize(image)
    # 输入和输出都是一幅二值图像。
    # 例1:
    from skimage import morphology,draw
    import numpy as np
    import matplotlib.pyplot as plt
    
    #创建一个二值图像用于测试
    image = np.zeros((400, 400))
    
    #生成目标对象1(白色U型)
    image[10:-10, 10:100] = 1
    image[-100:-10, 10:-10] = 1
    image[10:-10, -100:-10] = 1
    
    #生成目标对象2(X型)
    rs, cs = draw.line(250, 150, 10, 280)
    for i in range(10):
        image[rs + i, cs] = 1
    rs, cs = draw.line(10, 150, 250, 280)
    for i in range(20):
        image[rs + i, cs] = 1
    
    #生成目标对象3(O型)
    ir, ic = np.indices(image.shape)
    circle1 = (ic - 135)**2 + (ir - 150)**2 < 30**2
    circle2 = (ic - 135)**2 + (ir - 150)**2 < 20**2
    image[circle1] = 1
    image[circle2] = 0
    
    #实施骨架算法
    skeleton =morphology.skeletonize(image)
    
    #显示结果
    fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
    
    ax1.imshow(image, cmap=plt.cm.gray)
    ax1.axis('off')
    ax1.set_title('original', fontsize=20)
    
    ax2.imshow(skeleton, cmap=plt.cm.gray)
    ax2.axis('off')
    ax2.set_title('skeleton', fontsize=20)
    
    fig.tight_layout()
    plt.show()
    
    
    #例2:利用系统自带的马图片进行骨架提取
    from skimage import morphology,data,color
    import matplotlib.pyplot as plt
    
    image=color.rgb2gray(data.horse())
    image=1-image #反相
    #实施骨架算法
    skeleton =morphology.skeletonize(image)
    
    #显示结果
    fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
    
    ax1.imshow(image, cmap=plt.cm.gray)
    ax1.axis('off')
    ax1.set_title('original', fontsize=20)
    
    ax2.imshow(skeleton, cmap=plt.cm.gray)
    ax2.axis('off')
    ax2.set_title('skeleton', fontsize=20)
    
    fig.tight_layout()
    plt.show()
    
    ## skimage.morphology.medial_axis(image, mask=None, return_distance=False)
    # medial_axis就是利用中轴变换方法计算前景(1值)目标对象的宽度,格式为:
    # skimage.morphology.medial_axis(image, mask=None, return_distance=False)
    # mask: 掩模。默认为None, 如果给定一个掩模,则在掩模内的像素值才执行骨架算法。
    # return_distance: bool型值,默认为False. 如果为True, 则除了返回骨架,还将距离变换值也同时返回。这里的距离指的是中轴线上的所有点与背景点的距离。
    #例3:
    import numpy as np
    import scipy.ndimage as ndi
    from skimage import morphology
    import matplotlib.pyplot as plt
    
    #编写一个函数,生成测试图像
    def microstructure(l=256):
        n = 5
        x, y = np.ogrid[0:l, 0:l]
        mask = np.zeros((l, l))
        generator = np.random.RandomState(1)
        points = l * generator.rand(2, n**2)
        mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
        mask = ndi.gaussian_filter(mask, sigma=l/(4.*n))
        return mask > mask.mean()
    
    data = microstructure(l=64) #生成测试图像
    
    #计算中轴和距离变换值
    skel, distance =morphology.medial_axis(data, return_distance=True)
    
    #中轴上的点到背景像素点的距离
    dist_on_skel = distance * skel
    
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
    ax1.imshow(data, cmap=plt.cm.gray, interpolation='nearest')
    #用光谱色显示中轴
    ax2.imshow(dist_on_skel, cmap=plt.cm.spectral, interpolation='nearest')
    ax2.contour(data, [0.5], colors='w')  #显示轮廓线
    
    fig.tight_layout()
    plt.show()
    个人学习记录
  • 相关阅读:
    [LeetCode]78. Remove Nth Node From end of List删除链表中倒数第N个节点
    [LeetCode]77. Reverse Linked List反转链表
    [LeetCode]76. Permutation Sequence全排列序列
    [LeetCode]75. Pow(x,n)幂运算
    粘连字符分割初探~~
    验证码识别学习~~
    用VS2010编C#程序扫盲 2
    用VS2010编C#程序扫盲
    验证码降噪方法汇总~~~~~
    新生活......
  • 原文地址:https://www.cnblogs.com/jeshy/p/14844107.html
Copyright © 2020-2023  润新知