从 scikit-image 中提取特征周长坐标
Extracting feature perimeter coordinates from 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), fill_value=i, dtype=int).reshape(-1,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)
我想提取地物周边的坐标。我的意图是使用这些坐标为 .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), fill_value=i, dtype=int).reshape(-1,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)