Kmeans聚类算法:是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
假设k值为2时的迭代聚类
案例:对一张图片进行主色调提取
1、压缩图片,将图片中各像素块的颜色进行储存
def colorz(filename,n=3):
img=Image.open(filename)
img=img.rotate(-90)
img.thumbnail((200,200))
w,h=img.size
print(w,h)
print('w*h=',w*h)
points=[]
for count,color in img.getcolors(w*h):
points.append(color)
2、对图片的像素点的集合进行聚类,计算出中心点的色彩值
def kmeansColor(img,n):
points=colorz(img,3)
fe = np.array(points,dtype=float)
codebook, distortion = kmeans(fe,n) #n表示有n个聚类中心
centers=np.array(codebook,dtype=int)#计算出的色彩中心位置
return centers
3、可视化显示聚类结果,rgb的原理
#print("codebook:", codebook) #聚类中心
centers=np.array(codebook,dtype=int) #变为色彩,还得转为整数
fe=np.array(points)
plt.scatter(fe[:,0], fe[:,2], c='b')#设置全部像素点的颜色为蓝色
plt.scatter(codebook[:, 0], codebook[:,2], c='r') #聚类中心为红色
plt.show()
设置5个聚类中心的结果:
在HTML中显示:
{% for c in imgcolors %}
<div style="background-color:rgb({{c[0]}},{{c[1]}},{{c[2]}}); width: 40%; height: 30%;">
<font style="color:rgb({{c[0]}},{{c[1]}},{{c[2]}});font-size:50px">1</font>
</div>
{% endfor %}