代码如下:
import numpy as np
import cv2
import time
import os
#聚类算法
def cluster(points, radius=100,nums=250):
"""
points: pointcloud
radius: max cluster range
"""
print("................", len(points))
items = []
while len(points)>1:
item = np.array([points[0]])
base = points[0]
points = np.delete(points, 0, 0)
distance = (points[:,0]-base[0])**2+(points[:,1]-base[1])**2#获得距离
infected_points = np.where(distance <= radius**2)#与base距离小于radius**2的点的坐标
item = np.append(item, points[infected_points], axis=0)
border_points = points[infected_points]
points = np.delete(points, infected_points, 0)
while len(border_points) > 0:
border_base = border_points[0]
border_points = np.delete(border_points, 0, 0)
border_distance = (points[:,0]-border_base[0])**2+(points[:,1]-border_base[1])**2
border_infected_points = np.where(border_distance <= radius**2)
#print("/",border_infected_points)
item = np.append(item, points[border_infected_points], axis=0)
if len(border_infected_points)>0:
for k in border_infected_points:
if points[k] not in border_points:
border_points=np.append(border_points,points[k], axis=0)
#border_points = points[border_infected_points]
points = np.delete(points, border_infected_points, 0)
if len(item) >= nums:
items.append(item)
return items
if __name__ == '__main__':
start=time.time()
img_paths = r"D:\AI\project\eye_hand_biaoding\railways\dbscan\img\000003.jpg"
img = cv2.imread(img_paths,0)
clusters=cluster(points, radius=100,nums=250)
代码中的第一个函数是聚类算法,输入的参数是灰度图片,聚类的半径,和成为类的最少点的个数。建议使用该算法时尽量减小数据量,如果图片的像素很大,可以截取成几个部分进行聚类。