我正在寻找提取特征周界的坐标。我的意图是使用这些坐标为.tif图像中所有感兴趣的特征找到最接近的边到边的欧几里德距离。我对scikit image比较陌生,不知道是否可以使用https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops提供的选项来完成这项工作?
我能够从skimage.measure.regionprops中提取填充区域的二进制布尔矩阵。
[[False False True True True False False False False False]
[False False True True True True True True False False]
[False False True True True True True True False False]
[False False True True True True True True True False]
[False False False True True True True True True True]
[False True True True True True True True True True]
[False True True True True True True True True True]
[ True True True True True True True True True True]
[ True True True True True True True True True True]
[False True True True True True True True True True]
[False True True True True True True True True True]
[False True True True True True True True True False]
[False True True True True True True True False False]
[ True True True True True True True False False False]
[ True True True True True True False False False False]
[False False True True True False False False False False]]

在一些平滑、膨胀和侵蚀技术之后,使用二进制logistic回归分类器基于灰度和形态学属性识别这些特征。
我尝试获取周长坐标:
for m in matrix:
y, x = m.shape
l = []
for i in np.arange(x):
r = np.argwhere(m[:, i][m[:, i] == 0]).ravel().reshape(-1, 1)
t = np.full(shape=len(r), fill_value=i, dtype=int).reshape(-1, 1)
if i==0 or i==x:
coords = np.hstack((r, t))
l.append(coords)
else:
if len(r) <= 1:
coords = np.hstack((r, t))
l.append(coords)
else:
r = r[[0, -1]] # Problem, may not capture all coordinates.
# if the feature has concave regions.
t = np.full(shape=len(r), fill_value=i, dtype=int).reshape(-1,1)
coords = np.hstack((r, t))
l.append(coords)我认为如果没有凹面区域,这是可行的,不幸的是,我看到的一些特征肯定是新月形的。我想我可以在另一个轴上第二次运行这个函数,并确定唯一的坐标?我可以想象有一个更好的方法。
另外,最终我需要将这些坐标映射回原始图像坐标。我想我可以使用边界框角来进行坐标转换。如果我可以对坐标进行排序,这样我就可以将它们绘制为要素周围的多边形,但这不是进行最小边到边距离计算所必需的。
这个解决方案是不是可以作为udf添加到scikit-image.measure.regionsprops 'extra_properties‘参数中?
发布于 2021-05-03 00:27:44
有了比拉尔的回应,我才能想出一个合适的解决方案。
perimeter = binary_image ^ binary_erosion(binary_image)
for i in [0, -1]:
vedges = np.argwhere(m[:, i] == True).ravel()
if len(vedges) == 0: continue
for x in vedges:
perimeter[x, i] = True
hedges = np.argwhere(m[i, :] == True).ravel()
if len(hedges) == 0: continue
for y in hedges:
perimeter[i, y] = True
coordinates = np.argwhere(perimeter == True)https://stackoverflow.com/questions/67118444
复制相似问题