问题描述
我试图找到每个轮廓的宽度,但它返回无穷大宽度。任何机构都对此 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 库可以为您测量骨架分支长度:
在这种情况下:
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