Python 二值图像中轮廓线的细化

Python 二值图像中轮廓线的细化,python,image-processing,binary,Python,Image Processing,Binary,我有一个带有轮廓线的二值图像,需要净化每个轮廓线中所有不必要的像素,留下一条最小连接线 有人能给我一个关于这类问题的源代码、代码示例或进一步的信息,以及在哪里寻求帮助吗?对二值图像进行腐蚀和膨胀(反之亦然)的组合可以帮助消除像椒盐一样的噪声,留下完整的小线条。关键词是“秩序滤波器”和“形态滤波器”。二值图像上的腐蚀和膨胀(反之亦然)组合有助于消除椒盐噪声,留下完整的小线条。关键词是“排名过滤器”和“形态过滤器”。如果您正在寻找python实现,请查看 本质上是您的用例 或者,如果您想坚持使用“直

我有一个带有轮廓线的二值图像,需要净化每个轮廓线中所有不必要的像素,留下一条最小连接线


有人能给我一个关于这类问题的源代码、代码示例或进一步的信息,以及在哪里寻求帮助吗?

对二值图像进行腐蚀和膨胀(反之亦然)的组合可以帮助消除像椒盐一样的噪声,留下完整的小线条。关键词是“秩序滤波器”和“形态滤波器”。

二值图像上的腐蚀和膨胀(反之亦然)组合有助于消除椒盐噪声,留下完整的小线条。关键词是“排名过滤器”和“形态过滤器”。

如果您正在寻找python实现,请查看

本质上是您的用例

或者,如果您想坚持使用“直”scipy,您可以使用successiver。(正如@AxezDNyde提到的那样。)


编辑:链接已修复。

如果您正在寻找python实现,请查看

本质上是您的用例

或者,如果您想坚持使用“直”scipy,您可以使用successiver。(正如@AxezDNyde提到的那样。)


编辑:链接已修复。

实际上有一种称为张孙细化算法的算法。您可以在此处找到其代码:

我还用Python编写了一个矢量化版本,速度大约是该代码的10倍。代码如下:

def neighbours_vec(image):
    return image[2:,1:-1], image[2:,2:], image[1:-1,2:], image[:-2,2:], image[:-2,1:-1],     image[:-2,:-2], image[1:-1,:-2], image[2:,:-2]

def transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9):
    return ((P3-P2) > 0).astype(int) + ((P4-P3) > 0).astype(int) + \
    ((P5-P4) > 0).astype(int) + ((P6-P5) > 0).astype(int) + \
    ((P7-P6) > 0).astype(int) + ((P8-P7) > 0).astype(int) + \
    ((P9-P8) > 0).astype(int) + ((P2-P9) > 0).astype(int)

def zhangSuen_vec(image, iterations):
    for iter in range (1, iterations):
        print iter
        # step 1    
        P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image)
        condition0 = image[1:-1,1:-1]
        condition4 = P4*P6*P8
        condition3 = P2*P4*P6
        condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1
        condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6)
        cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1)
        changing1 = numpy.where(cond == 1)
        image[changing1[0]+1,changing1[1]+1] = 0
        # step 2
        P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image)
        condition0 = image[1:-1,1:-1]
        condition4 = P2*P6*P8
        condition3 = P2*P4*P8
        condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1
        condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6)
        cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1)
        changing2 = numpy.where(cond == 1)
        image[changing2[0]+1,changing2[1]+1] = 0
    return image
def\u vec(图像):
返回图像[2:,1:-1],图像[2:,2:],图像[1:-1,2:],图像[:-2,2:],图像[:-2,1:-1],图像[:-2,:-2],图像[1:-1,:-2],图像[2:,:-2]
def转换(P2、P3、P4、P5、P6、P7、P8、P9):
返回((P3-P2)>0.astype(int)+((P4-P3)>0.astype(int)+\
((P5-P4)>0.aType(int)+((P6-P5)>0.aType(int)+\
((P7-P6)>0.aType(int)+((P8-P7)>0.aType(int)+\
((P9-P8)>0.aType(int)+((P2-P9)>0.aType(int)
def zhangSuen_vec(图像,迭代):
对于范围内的iter(1,迭代):
印刷iter
#第一步
P2,P3,P4,P5,P6,P7,P8,P9=邻居(图)
条件0=图像[1:-1,1:-1]
条件4=P4*P6*P8
条件3=P2*P4*P6
条件2=转换(P2、P3、P4、P5、P6、P7、P8、P9)=1

condition1=(2实际上有一个算法叫做Zhang Suen细化算法。你可以在这里找到它的代码:

我还用Python编写了一个矢量化版本,速度大约是该代码的10倍

def neighbours_vec(image):
    return image[2:,1:-1], image[2:,2:], image[1:-1,2:], image[:-2,2:], image[:-2,1:-1],     image[:-2,:-2], image[1:-1,:-2], image[2:,:-2]

def transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9):
    return ((P3-P2) > 0).astype(int) + ((P4-P3) > 0).astype(int) + \
    ((P5-P4) > 0).astype(int) + ((P6-P5) > 0).astype(int) + \
    ((P7-P6) > 0).astype(int) + ((P8-P7) > 0).astype(int) + \
    ((P9-P8) > 0).astype(int) + ((P2-P9) > 0).astype(int)

def zhangSuen_vec(image, iterations):
    for iter in range (1, iterations):
        print iter
        # step 1    
        P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image)
        condition0 = image[1:-1,1:-1]
        condition4 = P4*P6*P8
        condition3 = P2*P4*P6
        condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1
        condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6)
        cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1)
        changing1 = numpy.where(cond == 1)
        image[changing1[0]+1,changing1[1]+1] = 0
        # step 2
        P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image)
        condition0 = image[1:-1,1:-1]
        condition4 = P2*P6*P8
        condition3 = P2*P4*P8
        condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1
        condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6)
        cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1)
        changing2 = numpy.where(cond == 1)
        image[changing2[0]+1,changing2[1]+1] = 0
    return image
def\u vec(图像):
返回图像[2:,1:-1],图像[2:,2:],图像[1:-1,2:],图像[:-2,2:],图像[:-2,1:-1],图像[:-2,:-2],图像[1:-1,:-2],图像[2:,:-2]
def转换(P2、P3、P4、P5、P6、P7、P8、P9):
返回((P3-P2)>0.astype(int)+((P4-P3)>0.astype(int)+\
((P5-P4)>0.aType(int)+((P6-P5)>0.aType(int)+\
((P7-P6)>0.aType(int)+((P8-P7)>0.aType(int)+\
((P9-P8)>0.aType(int)+((P2-P9)>0.aType(int)
def zhangSuen_vec(图像,迭代):
对于范围内的iter(1,迭代):
印刷iter
#第一步
P2,P3,P4,P5,P6,P7,P8,P9=邻居(图)
条件0=图像[1:-1,1:-1]
条件4=P4*P6*P8
条件3=P2*P4*P6
条件2=转换(P2、P3、P4、P5、P6、P7、P8、P9)=1

条件1=(2PyPi上有一个名为just pip install的软件包。它实现了Guo和Hall针对凹凸阵列/opencv灰度图像的细化算法。

PyPi上有一个名为just pip install的软件包。它实现了Guo和Hall针对凹凸阵列/opencv灰度图像的细化算法图像。

我在谷歌上搜索了“图形算法细化线条”,点击率很高。你试过这个吗?我在谷歌上搜索了“图形算法细化线条”,点击率很高。你试过这个吗?