dbscan 聚类并可视化简单案例
import math import numpy as np from sklearn.cluster import DBSCAN import cv2 colors_8 = [ (255, 255, 255), # White (255, 0, 0), # Red (0, 255, 0), # Lime (0, 0, 255), # Blue (255, 255, 0), # Yellow (0, 255, 255), # Cyan (255, 0, 255) # Magenta ] # 计算自定义的距离度量 def line_distance(line1, line2): x1, theta1 = line1 x2, theta2 = line2 x_dis = x2 - x1 if abs(x_dis) < 2: x_dis = 0 return math.sqrt(x_dis ** 2 + (theta1 - theta2) ** 2) # DBSCAN 聚类 def dbscan_cluster(points, eps=4, min_samples=2): dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric=line_distance) dbscan.fit(points) return dbscan.labels_ # 主函数 if __name__ == "__main__": # 给定的线段数据 (x1, y1, x2, y2) # lines = [(252, 65, 253, 6), # 点1: (265, 105), (268, 0) # (246, 62, 247, 7), # 点2: (246, 62), (247, 7) # (246, 60, 246, 5), # 点3: (246, 60), (246, 5) # ] ##线下脚本 lines = [ (331 ,34, 333, 0), (328 ,32, 333, 126), (380 ,126, 380, 90), (329 ,61,331 ,119), (337 ,34 ,341, 80), (328 ,43 ,328, 74), ] # # app # lines = [ # (379 ,127 ,381, 0), # (332 ,32 ,333, 0), # ( 337, 35 ,341 ,77), # (330 ,117, 331 ,44), # (330, 68 ,331 ,15), # ] # # # 刀隔算法 lines = [ (328, 34 , 332 , 125), (334, 0 , 342, 81), (381 , 62, 381 , 24), (331 , 89 , 331 , 56), (337 , 9 , 342, 80), (379 , 5 , 379 , 61), (337, 35 , 341 , 82), (330 , 70, 330, 28), (329 , 80, 330, 113), ] # #刀尖角度未识别 target_points= [ (84 , 62), (85, 63), (85 , 97), ( 64 , 125), (65, 125), (62, 126), (63, 12), (60, 127), (61, 127),] if 0: dbscan_labels = dbscan_cluster(target_points) # 打印 DBSCAN 聚类标签 print("DBSCAN 聚类标签:", dbscan_labels) # 获取所有唯一的聚类标签 unique_labels = np.unique(dbscan_labels) # 创建一个空白图像用于显示 image = np.ones((600, 600, 3), dtype=np.uint8) * 255 # 白色背景 # 绘制聚类点 # 绘制每个点并根据聚类标签上色 for i, label in enumerate(dbscan_labels): color = colors_8[label] # 确保颜色循环 point = target_points[i] cv2.circle(image, point, 5, color, -1) # 绘制圆点,半径5,填充颜色 if 1 : # 极坐标转换 lines_polar = [] for line in lines: x1, y1, x2, y2 = line dx = x2 - x1 dy = y2 - y1 if dx == 0: x_value_when_y_0 = x1 if dy != 0: angle_radians = math.pi / 2 # 对应90度,转换为弧度制为pi/2 else: angle_radians = 0 else: slope = (y2 - y1) / (x2 - x1) if slope == 0: x_value_when_y_0 = x1 else: x_value_when_y_0 = x1 - y1 / slope m = dy / dx angle_radians = math.atan(m) lines_polar.append((x_value_when_y_0, angle_radians)) lines_polar = np.array(lines_polar) points = np.array(lines_polar) print("聚类后的点", points) dbscan_labels = dbscan_cluster(points) # 打印 DBSCAN 聚类标签 print("DBSCAN 聚类标签:", dbscan_labels) image = np.zeros((500, 500, 3), dtype=np.uint8) # 获取所有唯一的聚类标签 unique_labels = np.unique(dbscan_labels) # 遍历每个点并绘制 for i, label in enumerate(dbscan_labels): color = colors_8[label] line =lines[i] x1, y1, x2, y2 = line cv2.line(image, (x1, y1), (x2, y2), color, 2) # 显示图像 cv2.imshow('Clustered Points', image) cv2.waitKey(0) cv2.destroyAllWindows()
原文地址:https://blog.csdn.net/xtpyc/article/details/145030088
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!