【发布时间】:2019-11-20 06:33:03
【问题描述】:
我有一张彩色图像,想使用 OpenCV 对其进行 k-means 聚类。
这是我想要进行 k-means 聚类的图像。
这是我的代码:
import numpy as np
import cv2
import matplotlib.pyplot as plt
image1 = cv2.imread("./triangle.jpg", 0)
Z1 = image1.reshape((-1))
Z1 = np.float32(Z1)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K1 = 2
ret, mask, center =cv2.kmeans(Z1,K1,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
print(center)
res_image1 = center[mask.flatten()]
clustered_image1 = res_image1.reshape((image1.shape))
for c in center:
plt.hlines(c, xmin=0, xmax=max(clustered_image1.shape[0], clustered_image1.shape[1]), lw=1.)
plt.imshow(clustered_image1)
plt.show()
这是我从center 变量中得到的。
[[112]
[255]]
这是输出图像
我的问题是我无法理解输出。我在center 变量中有两个列表,因为我想要两个类。但是为什么它们只有一个值呢?
不应该是这样的吗(这是有道理的,因为质心应该是点):
[[x1, y1]
[x2, y2]]
而不是这个:
[[x]
[y]]
如果我将图像读取为这样的彩色图像:
image1 = cv2.imread("./triangle.jpg")
Z1 = image1.reshape((-1, 3))
我得到这个输出:
[[255 255 255]
[ 89 173 1]]
彩色图像输出
有人可以向我解释如何获得 2d 点而不是线吗?另外,在使用彩色图像时,如何解释从center 变量得到的输出?
如果我在任何地方不清楚,请告诉我。谢谢!!
【问题讨论】:
-
你为什么要做kmeans聚类来找到一个绿色三角形的质心?只需使用轮廓或斑点或图像时刻并从中获取质心统计信息。 kmeans 的质心位于色彩空间而非笛卡尔空间。
-
其实这是一张测试图。我的实际图像看起来像这样pasteboard.co/IntLuRr.png
标签: python opencv k-means centroid