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()
相关推荐
BYSJMG21 小时前
计算机毕设选题推荐:基于大数据的癌症数据分析与可视化系统
大数据·vue.js·python·数据挖掘·数据分析·课程设计
我材不敲代码1 天前
Python爬虫介绍——简单了解一下爬虫
开发语言·爬虫·python
naruto_lnq1 天前
Python日志记录(Logging)最佳实践
jvm·数据库·python
yuankoudaodaokou1 天前
高帧率扫描如何重塑动态三维扫描与思看科技300fps解决方案
python·科技
rainbow68891 天前
Python零基础到精通全攻略
python
毕设源码-朱学姐1 天前
【开题答辩全过程】以 基于python网络安全知识在线答题系统为例,包含答辩的问题和答案
开发语言·python·web安全
2301_765703141 天前
Python异步编程入门:Asyncio库的使用
jvm·数据库·python
Dxy12393102161 天前
Python判断MySQL表是否存在,不存在则创建
python·mysql·adb
BYSJMG1 天前
2026计算机毕设推荐:基于大数据的车辆二氧化碳排放量可视化分析系统
大数据·vue.js·python·mysql·django·课程设计
Pyeako1 天前
opencv计算机视觉--DNN模块实现风格迁移
python·opencv·计算机视觉·pycharm·dnn·预处理·风格迁移