0

我有两个数组

label = array([2, 4, 1, 1, 6, 0, 0, 0, 3, 5])

coord = array([[370,  31, 411,  15],
               [246, 122, 316,  73],
               [423, 139, 430, 134],
               [420, 143, 429, 140],
               [ 57, 199,  99, 180],
               [387, 272, 390, 267],
               [390, 277, 393, 272],
               [396, 287, 399, 283],
               [ 75, 318, 102, 295],
               [556, 333, 568, 308]])

coord是一个坐标数组,每一行都是一个矩形。像那样http://i.imgur.com/EVnIzTD.jpg

我的算法应该发现七个不同之处,但它没有。所以我执行 kmeans 算法,让我的数组标签

label是 kmeans 算法的结果。它表明第 3-4 行和第 6、7、8 行应该是同一个矩形

这个想法是修改我的数组坐标,以按照这种模式将 row3/row4 和 row6/row7/row8 合并在一起[min_val_col1,max_val_col2,max_val_3,min_val_4]

结果应该是这样的 => http://i.imgur.com/XBQ0hHs.png

我真的被困住了,我不知道如何进行。有人可以帮助我吗?

4

3 回答 3

0

您可以使用scikit-learn dbscan按距离对矩形进行聚类。我认为您需要从每个矩形中提取 4 个点并用它们所属的矩形标记它们,将这些点聚集在一起,也许会更改,eps直到总共有 7 个矩形。

于 2013-08-30T00:35:35.170 回答
0

以下应该(我相信)做你需要的:

u = unique(label)
new_coord = empty((len(u), 4))

i = 0
for j in u:
    rects = compress(label == j, coord, 0)

    mn = rects.min(0)
    mx = rects.max(0)

    new_coord[i] = (mn[0], mx[1], mx[2], mn[3])

    i += 1

print new_coord

基本上,它在数组中找到唯一值label并使用它们拉出数组中每个对应的矩形coord组。然后它计算出这些矩形组的每一列中的最小值和最大值,并使用它们来填充new_coord数组中的新矩形。

在您的示例数组上使用它,我得到以下输出:

[[ 387.  287.  399.  267.]
 [ 420.  143.  430.  134.]
 [ 370.   31.  411.   15.]
 [  75.  318.  102.  295.]
 [ 246.  122.  316.   73.]
 [ 556.  333.  568.  308.]
 [  57.  199.   99.  180.]]

请注意,尽管我对 NumPy 还比较陌生——我相信这可以通过一些我没有想到的快捷方式来简化。

于 2013-08-30T00:55:05.303 回答
0

我不是 Python 专家,所以我确信这不是世界上最“pythonic”的解决方案,但它似乎适用于普通列表和大声笑:

gotBox = {}
for i in range(len(label)):
    index = label[i]
    if index in gotBox:
        gotBox[index][0] = min(gotBox[index][0], coord[i][0])
        gotBox[index][1] = max(gotBox[index][1], coord[i][1])
        gotBox[index][2] = max(gotBox[index][2], coord[i][2])
        gotBox[index][3] = min(gotBox[index][3], coord[i][3])
    else:
        gotBox[index] = coord[i]

uniques = [gotBox[i] for i in gotBox]
print uniques
于 2013-08-30T01:06:44.383 回答