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()
相关推荐
2401_873204655 分钟前
Python面向对象编程(OOP)终极指南
jvm·数据库·python
XW010599921 分钟前
6-函数-1 使用函数求特殊a串数列和
数据结构·python·算法
m0_5698814728 分钟前
使用Python进行网络设备自动配置
jvm·数据库·python
波诺波32 分钟前
项目pid-control-simulation-main 中的 main.py 代码讲解
开发语言·python
巧妹儿1 小时前
Python 配置管理封神技:pydantic_settings+@lru_cache,支持优先级,安全又高效,杜绝重复加载!
开发语言·python·ai·配置管理
独隅1 小时前
Python AI 全面使用指南:从数据基石到智能决策
开发语言·人工智能·python
胡耀超1 小时前
Web Crawling 网络爬虫全景:技术体系、反爬对抗与全链路成本分析
前端·爬虫·python·网络爬虫·数据采集·逆向工程·反爬虫
小陈的进阶之路1 小时前
Selenium元素定位
python·selenium
李昊哲小课1 小时前
matplotlib多子图与复杂布局实战
python·数据分析·matplotlib·数据可视化