如何解决如何从numpy数组中删除重叠的块?
我正在使用cv2.goodFeaturesToTrack
函数在图像中查找特征点。最终目标是提取特定大小的正方形块,并以特征点为这些块的中心。
但是,许多特征点彼此靠近,因此这些块是重叠的,这不是我想要的。
这是所有特征点(中心)的示例:
array([[3536.,1419.],[2976.,1024.],[3504.,1400.],[3574.,1505.],[3672.,1453.],[3671.,1442.],[3489.,1429.],[3108.,737.]])
比方说,我想找到前n
个blockRadius = 400
块,它们不重叠。关于如何实现这一目标的任何想法?
解决方法
您可以更进一步scipy.spatial.KDTree
-尽管它不支持查询由不同数量的点组成的块。因此,它可以与另一个库python-igraph
结合使用,该库允许快速查找闭合点的连接组件:
from scipy.spatial import KDTree
import igraph as ig
data = np.array([[3536.,1419.],[2976.,1024.],[3504.,1400.],[3574.,1505.],[3672.,1453.],[3671.,1442.],[3489.,1429.],[3108.,737.]])
edges1 = KDTree(data[:,:1]).query_pairs(r=400)
edges2 = KDTree(data[:,1:]).query_pairs(r=400)
g = ig.Graph(n = len(data),edges=edges1 & edges2)
i = g.clusters()
因此,簇对应于某种内部类型igraph
的块点的索引序列。快速预览:
>>> print(i)
Clustering with 8 elements and 2 clusters
[0] 0,2,3,4,5,6
[1] 1,7
>>> pal = ig.drawing.colors.ClusterColoringPalette(len(i)) #number of colors used
color = pal.get_many(i.membership) #list of color tags
ig.plot(g,bbox = (200,100),layout=g.layout('circle'),vertex_label=g.vs.indices,vertex_color = color,vertex_size = 12,vertex_label_size = 8)
用法示例:
>>> [data[n] for n in i] #or list(i)
[array([[3536.,1429.]]),array([[2976.,737.]])]
备注: 此方法允许使用成对的封闭点代替n*n
矩阵,这在某些情况下在内存中效率更高。
您将需要迭代执行此操作,因为这样的经常性辍学无法向量化。我想这样的事情会起作用
from scipy.spatial.distance import pdist,squareform
c = np.array([[3536.,737.]])
dists = squareform(pdist(c,metric = 'chebyshev')) # distance matrix,chebyshev here since you seem to want blocks
indices = np.arange(c.shape[0]) # indices that haven't been dropped (all to start)
out = [0] # always want the first index
while True:
try:
indices = indices[dists[indices[0],indices] > 400] #drop indices that are inside threshhold
out.append(indices[0]) # add the next index that hasn't been dropped to the output
except:
break # once you run out of indices,you'll get an IndexError and you're done
print(out)
[0,1]
让我们尝试一些要点:
np.random.seed(42)
c = np.random.rand(10000,2) * 800
dists = squareform(pdist(c,checbyshev here since you seem to want squares
indices = np.arange(c.shape[0]) # indices that haven't been dropped (all to start)
out = [0] # always want the first index
while True:
try:
indices = indices[dists[indices[0],you'll get an IndexError and you're done
print(out,pdist(c[out],metric = 'chebyshev'))
[0,6,17] [635.77582886 590.70015659 472.87353138 541.13920029 647.69071411
476.84658995]
因此,有4个点(因为4个400x400块以4个图块组成一个800x800的空间是有意义的),大部分都是低值(17 400
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。