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()
相关推荐
Csvn8 分钟前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
大鹏说大话2 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python
Niuguangshuo2 小时前
silero-vad:超轻量级开源 VAD 实践指南
开发语言·python
2501_944676163 小时前
揭秘!WORDTIP公司靠不靠谱?小白必看
大数据·人工智能·python
Minner-Scrapy4 小时前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
CODER03044 小时前
Anaconda和Mamba创建环境管理包常用命令合集
python·深度学习·conda·虚拟环境·mamba·常用命令大全
闲猫4 小时前
LangGraph / Capabilities / Fault tolerance
python·agent·langgraph
IvanCodes5 小时前
Python 基础语法(一):变量、数据类型与运算符
python
程序员三藏6 小时前
浅谈性能测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
l1258656 小时前
# RAG向量数据库优化实战:HNSW索引调参与生产级性能设计
数据库·python·mysql·langchain