如何计算蠕虫的最大宽度和长度?

问题描述

我试图找到每个轮廓的宽度,但它返回无穷大宽度。任何机构都对此 Image 有想法。首先找到所有轮廓并使用 Hausdorff 距离计算距离。

我的代码如下:

读取图片

img = imread('M2 Output.jpg')

gray= img[:,:,0]
print('gray',gray.shape)
Binary = gray / 255
mask = np.zeros_like(img)

寻找轮廓

contours = measure.find_contours(Binary,0.8)
def drawShape(img,coordinates,color):
    # In order to draw our line in red
    #img = color.gray2rgb(img)

    # Make sure the coordinates are expressed as integers
    coordinates = coordinates.astype(int)

    img[coordinates[:,0],coordinates[:,1]] = color

    return img

质心函数

def centeroidnp(arr):
    length = len(arr[0])
    sum_x = np.sum(arr[0])
    sum_y = np.sum(arr[1])
    return (sum_x//length),(sum_y//length)

曼哈顿距离

def manhattan(p1,p2):
    dist = abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
    return dist

每个轮廓的宽度计算

for contour in contours:
    contouri=contour.astype(int)
    #print(contouri)
    mask = np.zeros_like(img)
    imge = drawShape(mask,contouri,[255,255,255])
    print('Image',imge)
    orig = imge.copy()
    plt.figure(figsize=(10,10))
    plt.title('Contour')
    plt.imshow(imge)   
    plt.show()
  
    centeroid = centeroidnp(contouri)
    print(centeroid)
    # Manual Threshold Limit
    thresh = 0.0
    dist = []
    # Get Worm Ends Location
    for i in range(len(contouri[0])):
        # Calculate the distance from the centroid
        print(contouri[0][i],contouri[1][i])
        dist.append(manhattan((contouri[0][i],contouri[1][i]),centeroid))
        print(dist)
        # Get Worm Ends Location
        ends_index = (np.argwhere(dist> thresh * 
        max(dist))).astype(int) 
        print('endix',ends_index)
# Padding of the ends 
imge[contouri[0][ends_index],contouri[1][ends_index]] = 0

# Label each thread
lab = label(imge)
# Thread 1
u = lab.copy()
u[u==1] = 0
u[u>0] = 1
print('u',u)
# Thread 2
v = lab.copy()
v[v==2] = 0
v[v>0] = 1
# Hausdorff distance
#width = round(metrics.hausdorff_distance(u,v))
width = metrics.hausdorff_distance(u,v)
print('width:',width)

解决方法

如果您可以轻松生成正确的骨架,那么 skan 库可以为您测量骨架分支长度:

https://jni.github.io/skan

在这种情况下:

import skan

skel_obj = skan.Skeleton(skel)
skel_obj.path_lengths(0)

这里是 Skeleton 对象 API 的文档:

https://jni.github.io/skan/api/skan.csr.html#skan.csr.Skeleton

以及相关函数skan.summarize,它以骨架对象作为输入并生成一些汇总统计信息:

https://jni.github.io/skan/api/skan.csr.html#skan.csr.summarize