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()
相关推荐
墨绿色的摆渡人19 分钟前
pytorch小记(四):pytorch中的重排操作:x.permute()
人工智能·pytorch·python
2401_8914092620 分钟前
Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250102
大数据·数据库·python·金融·数据库开发
黑客Jack1 小时前
[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析
git·python·web安全
十二测试录1 小时前
Android SDK下载安装(图文详解)
android·经验分享·python·程序人生·adb·自动化
墨绿色的摆渡人1 小时前
pytorch小记(七):pytorch中的保存/加载模型操作
人工智能·pytorch·python
墨绿色的摆渡人1 小时前
pytorch小记(三):pytorch中的最大值操作:x.max()
人工智能·pytorch·python
风槐啊2 小时前
PyCharm 的安装与使用(Window)
ide·python·pycharm
Serendipity_Carl2 小时前
爬虫基础之爬取歌曲宝歌曲批量下载
爬虫·python·pycharm
坐吃山猪2 小时前
卷积神经04-TensorFlow环境安装
人工智能·python·tensorflow
IT古董2 小时前
【漫话机器学习系列】045.特征向量(Eigenvector)
人工智能·python·机器学习