from sklearn.cluster import DBSCAN
import cv2
import numpy as np
def dbscan_circle():
img = cv2.imread('./test.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
cv2.imshow("edges",edges)
points = np.argwhere(edges > 0)
# 聚类分析,eps表示聚类半径,min_samples表示聚类最小样本数
clustering = DBSCAN(eps=10,min_samples=4).fit(points)
core_samples_mask = np.zeros_like(clustering.labels_, dtype=bool)
core_samples_mask[clustering.core_sample_indices_] = True
labels = clustering.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
circles = []
for i in range(n_clusters_):
one_cluster = points[labels == i]
circles.append(cv2.minEnclosingCircle(one_cluster))
print(len(circles))
for circle in circles:
(x, y), r = circle
area = r*r*3.1415926
if area < 500:
continue
cv2.circle(img, (int(y), int(x)), int(r), (0, 255, 0), 2)
#cv2.circle(img, (int(y), int(x)), 2, (0, 0, 255), 3)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
dbscan_circle()
使用DBSCAN进行圆环聚类检测
最新推荐文章于 2024-07-10 14:51:46 发布