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灰度图像的细化算法图像。我在谷歌上搜索了“图形算法细化线条”,点击率很高。你试过这个吗?我在谷歌上搜索了“图形算法细化线条”,点击率很高。你试过这个吗?