Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中对二进制图像使用kmeans集群?_Python_Opencv_Computer Vision_K Means - Fatal编程技术网

如何在python中对二进制图像使用kmeans集群?

如何在python中对二进制图像使用kmeans集群?,python,opencv,computer-vision,k-means,Python,Opencv,Computer Vision,K Means,我试着用两个不同的人拍摄二元面具,其他的都是黑色的。现在,我想使用kmeans将每个人分组到他们自己的集群中,以便最终可以在他们周围绘制边界框。以下是我目前掌握的代码: def kmeans(img): k_values = range(1, 5) pixels = np.float32(img.reshape(-1,1)) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) flags

我试着用两个不同的人拍摄二元面具,其他的都是黑色的。现在,我想使用kmeans将每个人分组到他们自己的集群中,以便最终可以在他们周围绘制边界框。以下是我目前掌握的代码:

def kmeans(img):
  k_values = range(1, 5)
  pixels = np.float32(img.reshape(-1,1))
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
  flags = cv2.KMEANS_PP_CENTERS
  min_ssd = 0
  for k in k_values:
    ssd,labels,centers = cv2.kmeans(pixels,k,None,criteria,10,flags)
    if k == 1 or ssd < min_ssd: #looking for elbow in graph
      min_ssd = ssd
      min_labels = labels 
      min_centers = centers

  return min_labels,min_centers

我想我会为将来可能需要的任何人更新我的最终代码。

欢迎使用SO!请张贴图片,以便我们可以解决你的问题。如果你想质心坐标,你应该给kmeans坐标。也就是说,不要直接传递二进制掩码。对于遮罩上的每个像素,您首先必须生成一个坐标数组。@eldesgraciado,因此我将创建一个包含(x,y,pixel_val)的三元组数组?我不知道您是否还需要包含像素的强度值-除非您也计划使用该信息。只要一个
(x,y)
点数组就可以了,
kmeans
将返回每个簇的质心,也作为
(x,y)
数组,这将为您提供每个blob的质心。旁注:如果只查找每个blob质心,还可以执行组件分析并计算每个blob的边界框,从那里计算质心应该相当容易。你也可以使用中心矩来计算水滴的质心。连接的组件似乎是一个更好的解决方案来完成你想做的事情。或者从每个二进制块中获取轮廓的边界框。欢迎使用SO!请张贴图片,以便我们可以解决你的问题。如果你想质心坐标,你应该给kmeans坐标。也就是说,不要直接传递二进制掩码。对于遮罩上的每个像素,您首先必须生成一个坐标数组。@eldesgraciado,因此我将创建一个包含(x,y,pixel_val)的三元组数组?我不知道您是否还需要包含像素的强度值-除非您也计划使用该信息。只要一个
(x,y)
点数组就可以了,
kmeans
将返回每个簇的质心,也作为
(x,y)
数组,这将为您提供每个blob的质心。旁注:如果只查找每个blob质心,还可以执行组件分析并计算每个blob的边界框,从那里计算质心应该相当容易。你也可以使用中心矩来计算水滴的质心。连接的组件似乎是一个更好的解决方案来完成你想做的事情。或者从每个二进制blob获取轮廓的边界框。
 def kmeans_helper(img, centroids):
  data = np.nonzero(img)
  data = tuple(zip(data[0],data[1]))
  data = np.asarray(data).reshape(-1,2)

  num_clusters = len(centroids)
  kmeans = KMeans(n_clusters = num_clusters, init = centroids, n_init = 1)
  kmeans.fit(data)
  centroids_array = np.uint8(kmeans.cluster_centers_)

  num_labels = np.unique(kmeans.labels_)
  clusters = [data[kmeans.labels_ == label] for label in num_labels]

  return clusters