本文主要是介绍4.3 DBSCAN聚类算法(自己写的函数python),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
代码如下:
import numpy as np
import cv2
import time
import os#聚类算法
def cluster(points, radius=100,nums=250):"""points: pointcloudradius: 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])**2border_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 itemsif __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)
代码中的第一个函数是聚类算法,输入的参数是灰度图片,聚类的半径,和成为类的最少点的个数。建议使用该算法时尽量减小数据量,如果图片的像素很大,可以截取成几个部分进行聚类。
这篇关于4.3 DBSCAN聚类算法(自己写的函数python)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!