Python:获取分割图中每个簇的边界框坐标(2D numpy 数组)

标签 python arrays numpy label bounding-box

python :

我得到了一个分割图(2D numpy 数组),其中包含原始 img 的每个像素的类值(整数 0 到 N),我想在分割图中找到每个连接的簇的边界框坐标。

编辑: map 中每个类可能有多个集群!

我想我可以使用类似skimage.measure.label(seg_map, connectivity=1)

最佳答案

完整答案

有一个现有函数 scipy.ndimage.measurements.find_objects allllmost 完全符合您的要求。需要 Numpy 和 scipy.ndimage.measurements.label 的一点帮助, 虽然:

import numpy as np
import scipy.ndimage.measurements as mnts

A = np.array([
    [0, 0, 0, 0, 0, 0, 0],
    [0, 1, 1, 0, 2, 2, 0],
    [0, 1, 1, 0, 2, 2, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 4, 4, 0, 1, 1, 0],
    [0, 4, 4, 0, 1, 1, 0],
    [4, 0, 0, 0, 0, 0, 1]
])

structure = np.array([
    [1,1,1],
    [1,1,1],
    [1,1,1]
])

bboxSlices = {}
for i in range(1, A.max() + 1):
    B = A.copy()
    B[B != i] = 0

    bboxSlices[i] = mnts.find_objects(mnts.label(B, structure=structure)[0])

print(bboxSlices)

输出:

{1: [(slice(1, 3, None), slice(1, 3, None)),
     (slice(4, 7, None), slice(4, 7, None))],
 2: [(slice(1, 3, None), slice(4, 6, None))],
 3: [],
 4: [(slice(4, 7, None), slice(0, 3, None))]}

bboxSlices 字典中的每个条目都是一个元组列表。每个元组包含两个切片,一个行切片和一个列切片,每个切片定义一个围绕相应类的集群的边界框。

详情

label(...) 查找特征簇并用标签替换它们的值(例如,1 表示第一个簇,2 表示第二个簇,等等)。 find_objects(...) 然后找到每个标签周围的边界框。问题在于 label 将所有非零值视为“特征”。因此,对于每个类值 i,我们需要一份 A 的副本,其中所有非 i 值都已清零。

structure 定义集群的连接性。如果您想要不沿对角线连接的集群,您可以使用不同的结构:

structure = np.array([
    [0,1,0],
    [1,1,1],
    [0,1,0]
])

简单回答

如果每个类只有 1 个集群,这很容易:

import numpy as np

A = np.array([
    [0, 0, 0, 0, 0, 0, 0],
    [0, 1, 1, 0, 2, 2, 0],
    [0, 1, 1, 0, 2, 2, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 4, 4, 0, 3, 3, 0],
    [0, 4, 4, 0, 3, 3, 0],
    [0, 0, 0, 0, 0, 0, 0]
])

bboxCorners = {}
for i in range(1, A.max()+1):
    B = np.argwhere(A==i)
    bboxCorners[i] = B.min(0), B.max(0)

print(bboxCorners)

输出:

{1: (array([1, 1]), array([2, 2])),
 2: (array([1, 4]), array([2, 5])),
 3: (array([4, 4]), array([5, 5])),
 4: (array([4, 1]), array([5, 2]))}

关于Python:获取分割图中每个簇的边界框坐标(2D numpy 数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49774179/

相关文章:

python - 输出Keras中add_loss添加的多重loss

javascript - 使用 ".create"时如何使用 Mongoose 添加到数组中的对象

java - 从文件中读取,分割行并存储在数组中JAVA

python - 大部件的矢量幅度

python numpy - 通过删除显式 python 循环来优化 chisq 函数?

python - "<Python.h> no such file or directory"

python - 读取一个大的 big-endian 二进制文件

javascript - 如何使用 jquery 和 javascript 从对象数组中获取值

python - np.correlate() 中的模式 'same' 是如何工作的?

列表中的 Python 值