我正在尝试为我的机器人识别星际争霸2地图中的矿物/气体区域。下图显示了我所拥有的二维阵列的图,其中1'表示矿物或气体补丁。
注视它你可以看到有4个我想识别的星团。
我尝试过使用:
from scipy.ndimage import measurements
lw, num = measurements.label(map)
(map)是一个64,64阵列,其中有一个矿物/气体补丁。
这找到21个集群,因为在4个集群中,有一些空格。
另外,当我得到一个数组时,我不知道我正在寻找多少个集群。我正在研究连接组件标签,但是只要1s说3或4个位置元素就可以看到我看不到的方法,它们可以被认为是连接的。我只看过4或8个连接方法。
我应该如何解决这个问题?
答案 0 :(得分:0)
你的星团看起来很清楚,所以只需要稍微增长它们就可以融合它们的各个部分。例如,您可以使用scipy.ndimage.morphology.binary_dilation
:
from scipy.ndimage import measurements, morphology
import numpy as np
# create mock data
data = """
1111 1 1
1 1
1 11111
111111 111
1
1
"""
data = np.array(data.split('\n'))
data = data.view('U1').reshape(len(data), -1) == '1'
# blow it up a bit
data = np.kron(data, np.ones((2, 2), dtype=int))
# "algorithm" starts here
grow = morphology.binary_dilation(data, structure=np.ones((5, 5), dtype=int)
lbl, npatches = measurements.label(grow)
lbl[data==0] = 0
# end of algorithm
# show
res = '\n'.join(lbl.astype('U1').view(f"U{lbl.shape[1]}").ravel()).replace('0', ' ')
print(res)
输出:
11111111 11 22
11111111 11 22
11 22
11 22
11 22222222
11 22222222
3333333333 333333
3333333333 333333
33
33
33 3333
33 3333
如果它不能直接处理您的实际数据,请尝试使用其他结构元素或简单地扩展multiplr次。
答案 1 :(得分:0)
使用单链路层次聚类或DBSCAN进行集群是微不足道的。只需使用足够小的距离阈值来连接矿物附近,并分离远处的矿物质。可能5个细胞工作正常。
答案 2 :(得分:-2)
这实际上是一整类问题,clustering algorithms。
我建议从迭代的k-means风格方法开始,例如here。你可以运行它的大小2 - n(或者你认为你会发现的群集很多),然后使用P值来衡量群集的信心程度。 (即,当地图上有明显的3个聚类时,运行具有2个聚类的k-means时,P值应该非常高/不确定,如果你运行具有3个聚类的k均值,它们应该是低/确定的)
祝你好运!