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()
dbscan 聚类并可视化简单案例
墨鱼丸家2025-01-13 14:41
相关推荐
墨绿色的摆渡人19 分钟前
pytorch小记(四):pytorch中的重排操作:x.permute()2401_8914092620 分钟前
Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250102黑客Jack1 小时前
[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析十二测试录1 小时前
Android SDK下载安装(图文详解)墨绿色的摆渡人1 小时前
pytorch小记(七):pytorch中的保存/加载模型操作墨绿色的摆渡人1 小时前
pytorch小记(三):pytorch中的最大值操作:x.max()风槐啊2 小时前
PyCharm 的安装与使用(Window)Serendipity_Carl2 小时前
爬虫基础之爬取歌曲宝歌曲批量下载坐吃山猪2 小时前
卷积神经04-TensorFlow环境安装IT古董2 小时前
【漫话机器学习系列】045.特征向量(Eigenvector)