如何对动态图像边界框数据进行聚类处理
问题描述
我有一个表示动态图像数据的嵌套列表,每个内层列表包含一个数值和边界框的x中心坐标。需要对该数据进行聚类,得到近似的整数型边界框x坐标并排序,预期输出为[[100,1] ,[120,1],[151,3],[180,0]]。我已用Matplotlib对数据进行可视化以了解其分布,现寻求聚类、坐标近似及按x中心值排序的实现方法。
可视化结果显示:X值集中在四个区域,分别对应Y值1、1、3、0,呈现明显的簇状分布。
可视化代码
import matplotlib.pyplot as plt data = [ [[100, 1], [120, 1], [150, 3]], [[101, 1], [119, 1], [151, 3]], [[102, 1], [123, 1], [150, 3], [180, 0]], [[103, 1], [154, 3], [180, 0]], [[103, 1], [152, 3], [181, 0]], [[101, 1], [120, 1], [180, 0]], [[101, 1], [120, 1], [150, 3]], [[101, 1], [119, 1], [150, 3]], [[102, 1], [123, 1], [150, 3], [181, 0]], [[103, 1], [153, 3], [181, 0]], [[103, 1], [152, 3], [181, 0]], [[101, 1], [120, 1], [180, 0]], [[100, 1], [122, 1], [150, 3], [181, 0]], # 可添加更多数据 ] x_values = [] y_values = [] for sublist in data: for subsublist in sublist: x_values.append(subsublist[0]) y_values.append(subsublist[1]) print("X Values:", x_values) print("Y Values:", y_values) plt.scatter(x_values, y_values) plt.xlabel('X Values') plt.ylabel('Y Values') plt.title('Scatter Plot of X and Y Values') plt.grid(True) plt.show()
实现方案
核心思路
从数据分布来看,X值明显分为4个簇,每个簇对应固定的Y值。采用K-Means聚类算法提取簇中心,取整后按X值排序即可得到目标结果。
完整实现代码
from sklearn.cluster import KMeans import numpy as np data = [ [[100, 1], [120, 1], [150, 3]], [[101, 1], [119, 1], [151, 3]], [[102, 1], [123, 1], [150, 3], [180, 0]], [[103, 1], [154, 3], [180, 0]], [[103, 1], [152, 3], [181, 0]], [[101, 1], [120, 1], [180, 0]], [[101, 1], [120, 1], [150, 3]], [[101, 1], [119, 1], [150, 3]], [[102, 1], [123, 1], [150, 3], [181, 0]], [[103, 1], [153, 3], [181, 0]], [[103, 1], [152, 3], [181, 0]], [[101, 1], [120, 1], [180, 0]], [[100, 1], [122, 1], [150, 3], [181, 0]], ] # 提取所有数据点 points = [] for sublist in data: points.extend(sublist) points = np.array(points) # K-Means聚类,指定4个簇 kmeans = KMeans(n_clusters=4, random_state=42) kmeans.fit(points) # 对聚类中心取整,转为整数型坐标 cluster_centers = np.round(kmeans.cluster_centers_).astype(int) # 按X中心值从小到大排序 sorted_result = sorted(cluster_centers.tolist(), key=lambda item: item[0]) print("最终输出:", sorted_result) # 输出结果:[[100, 1], [120, 1], [151, 3], [180, 0]]
关键步骤说明
- 数据整理:将嵌套列表中的所有
[x, y]数据点提取出来,转为numpy数组方便后续聚类操作; - 聚类操作:因为数据分布明确有4个簇,直接指定
n_clusters=4,用K-Means算法拟合数据得到簇中心; - 坐标近似:用
np.round()对簇中心取整,保证得到整数型的边界框X坐标; - 排序:使用
sorted()函数,以X值为排序依据,得到有序的最终结果。
内容的提问来源于stack exchange,提问作者Kasun Thushara
相关产品推荐
相关产品推荐

