如何解决从 scikit-image 中提取特征周长坐标
我希望提取特征周长的坐标。我的意图是使用这些坐标为 .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]]
在一些平滑、膨胀和侵蚀技术之后,使用二元逻辑回归分类器根据灰度和形态特性识别这些特征。
我尝试获取周边坐标:
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),1)
coords = np.hstack((r,t))
l.append(coords)
如果没有凹面区域,我认为这可行,不幸的是,我正在查看的某些特征肯定是新月形的。我想我可以在另一个轴上第二次运行该函数并确定唯一坐标?我想有更好的方法。
此外,最终我需要将这些坐标映射回原始图像坐标。我想我可以使用边界框角来进行坐标传输。如果我能得到排序的坐标,这样我就可以将它们绘制为要素周围的多边形,那就太好了,但这不是进行最小边到边距离计算所必需的。
这个解决方案是否可以作为 udf 添加到 scikit-image.measure.regionsprops 'extra_properties' 参数中?
解决方法
根据 Bilal 的回应,我想出了一个合适的解决方案。
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。