【问题标题】:Extracting feature perimeter coordinates from scikit-image从 scikit-image 中提取特征周长坐标
【发布时间】:2021-07-11 01:54:32
【问题描述】:

我正在寻找提取要素周长的坐标。我的意图是使用这些坐标为 .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' 参数吗?

【问题讨论】:

  • edit 发布您自己的努力来解决这个问题。后者最好在代码中,这称为minimal reproducible example
  • @Bilal 我认为我能够相对接近一个解决方案,但我想有一个比我尝试这样做更有效的解决方案。
  • 如果您进行了边界提取,例如Morphological gradientimg - erosion (img),您可能有自己的边界,那么您可以创建一个nxn 数组,其中每个n 点之间有距离,您可以添加不小于n 四分之一的索引差异条件,以确保您正在寻找形状另一侧的点。

标签: python image-processing scikit-image


【解决方案1】:

根据 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2016-05-27
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2012-09-25
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多