线条的聚类和抑制(Non-Maximum Suppression, NMS)是一种常用的计算机视觉算法,用于检测图像中的边缘或线条。下面是一个使用Python和OpenCV库实现线条聚类和抑制的示例代码:
import cv2
import numpy as np
def line_clustering(lines, threshold):
clusters = []
for line in lines:
found_cluster = False
for cluster in clusters:
if abs(line[0] - cluster[0]) < threshold and abs(line[1] - cluster[1]) < threshold:
cluster.append(line)
found_cluster = True
break
if not found_cluster:
clusters.append([line])
return clusters
def nms(lines, overlap_threshold):
lines = sorted(lines, key=lambda x: x[2], reverse=True)
selected_lines = []
while len(lines) > 0:
best_line = lines[0]
selected_lines.append(best_line)
lines = lines[1:]
remaining_lines = []
for line in lines:
overlap = min(best_line[3], line[3]) - max(best_line[2], line[2])
if overlap <= 0:
remaining_lines.append(line)
lines = remaining_lines
return selected_lines
# 读取图像并提取边缘
image = cv2.imread('image.jpg', 0)
edges = cv2.Canny(image, 50, 150)
# 提取直线
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength=100, maxLineGap=10)
# 进行线条聚类
threshold = 10
clusters = line_clustering(lines, threshold)
# 画出聚类后的线条
clustered_image = np.zeros_like(image)
for cluster in clusters:
color = np.random.randint(0, 255, 3).tolist()
for line in cluster:
x1, y1, x2, y2 = line[0]
cv2.line(clustered_image, (x1, y1), (x2, y2), color, 2)
# 进行非极大值抑制
overlap_threshold = 0.3
selected_lines = nms(lines, overlap_threshold)
# 画出抑制后的线条
nms_image = np.zeros_like(image)
for line in selected_lines:
x1, y1, x2, y2 = line[0]
cv2.line(nms_image, (x1, y1), (x2, y2), (255, 255, 255), 2)
# 显示图像
cv2.imshow('Original Image', image)
cv2.imshow('Edge Image', edges)
cv2.imshow('Clustered Image', clustered_image)
cv2.imshow('NMS Image', nms_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
请注意,以上代码仅为示例,实际应用中可能需要根据具体情况进行调整和优化。