Python 用HDBSCAN对相似线路进行聚类

Python 用HDBSCAN对相似线路进行聚类,python,opencv,line-segment,hdbscan,Python,Opencv,Line Segment,Hdbscan,上面的图像是一个视频帧。最终目标是检测闸门。我想做的是将线聚类,类似于圆,没有圈的线是异常值。我的发现告诉我这是一个HDBSCAN问题,因此我尝试像这样实现HDBSCAN: import cv2 import numpy as np import hdbscan gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Create default Fast Line Detector (FSD) fld = cv2.ximgproc.create

上面的图像是一个视频帧。最终目标是检测闸门。我想做的是将线聚类,类似于圆,没有圈的线是异常值。我的发现告诉我这是一个HDBSCAN问题,因此我尝试像这样实现HDBSCAN:

import cv2
import numpy as np
import hdbscan

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Create default Fast Line Detector (FSD)
fld = cv2.ximgproc.createFastLineDetector(_length_threshold=60,
                                          _canny_th1=5,
                                          _canny_th2=5,
                                          _canny_aperture_size=3,
                                          _do_merge=True
                                          )

# Detect lines in the image
lines = fld.detect(gray_img)

cluster_lines = []
if type(lines) is not type(None):
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cluster_lines.append([(x1 + x2) // 2, (y1 + y2) // 2])
        # cluster_lines.append([x1, y1, x2, y2])

line_clusterer = hdbscan.HDBSCAN(min_cluster_size=3,
                                 cluster_selection_epsilon=0.5)
line_clusterer.fit(cluster_lines)
labels = line_clusterer.labels_
cluster_max = line_clusterer.labels_.max()

我试过两种方法,一种是直接输入一个直线列表,结果非常糟糕,我认为这是因为HDBSCAN不知道坐标代表一条直线。第二种方法是输入每条线的中点列表,虽然效果更好,但仍然不是很好。有没有一种方法可以改进这一点,并获得更类似于预期结果的结果

原始图像

我想尝试帮助您,但有3个问题。1) 您共享的唯一图像包含注释,因此我无法尝试处理它。2) 您的代码不完整,由于某种原因,您删除了
import
语句,因此我无法运行它。3) 我不知道“门”在你的图像中的位置。@MarkSetchell对此表示抱歉。我添加了导入和原始图像,并添加了用于检测线条的代码。请注意,要安装hdcscan,您需要numpy版本1.20.0。然而,我对其他建议持开放态度,目标是使用线条检测闸门,因为我已经尝试过颜色过滤,并试图避免CNN的。还要记住,这相当接近,我们希望能够在更远的地方和更暗的水中检测到它,也就是说,条件可能会有所不同