【问题标题】:How to compute maximum width and length of worms?如何计算蠕虫的最大宽度和长度?
【发布时间】:2021-04-24 11:08:58
【问题描述】:

我试图找到每个轮廓的宽度,但它返回无限宽度。任何人都对此Image 有想法。首先找到所有轮廓并使用豪斯多夫距离计算距离。

我的代码如下:

读取图片

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)

【问题讨论】:

标签: python computer-vision scikit-image mathematical-morphology


【解决方案1】:

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

https://jni.github.io/skan

在这种情况下:

import skan

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

这里是骨架对象 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

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2014-06-02
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多