我正在制作一个音乐识别程序,作为其中的一部分,我需要从png(2200x1700像素)中找到numpy数组最大的连接区域。我目前的解决办法如下。

labels, nlabels = ndimage.label(blobs)
cutoff = len(blobs)*len(blobs[0]) / nlabels
blobs_found = 0
x = []
t1 = time()
for n in range(1, nlabels+1):
    squares = np.where(labels==n)
    if len(squares[0]) < cutoff:
        blobs[squares] = 0
    else:
        blobs_found += 1
        blobs[squares] = blobs_found
        x.append(squares - np.amin(squares, axis=0, keepdims=True))
nlabels = blobs_found
print(time() - t1)

这是可行的,但需要大约6.5秒才能运行。有没有办法可以从这段代码中删除循环(或者加速循环)?

最佳答案

可以使用以下命令获取每个标记区域的大小(以像素为单位):

unique_labels = numpy.unique(labels)
label_sizes = scipy.ndimage.measurement.sum(numpy.ones_like(blobs), labels, unique_labels)

最大的将是:
unique_labels[label_size == numpy.max(label_size)]

10-07 12:08