目录
一、Scipy聚类kmeans概述
(一)基本概念
(二)聚类代码示例
二、聚类色彩提取实例
(一)PIL提取色彩
(二)对图片进行聚类
(三)对色彩聚类
三、聚类+Flask
(一)定义网页样式
(二)聚类程序代码实现
一、Scipy聚类kmeans概述
(一)基本概念
聚类是将数据集分为由相似数据点组成的组的过程,即将数据分割成指定数量的几个类,以便于揭示数据的内在性质及规律。其中,聚类分为中央聚类和层次结构聚类两种类型。
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,将距离相近的元素划分为一类,进而实现分组。
Scipy提供了用于K均值聚类,从k均值模型生成码本以及通过将它们与码本中的质心进行比较来量化向量的功能。
(二)聚类代码示例
选取一组数据,对其进行聚类分析。
具体代码如下 :
import numpy as np
from scipy.cluster.vq import vq, kmeans, whiten
import matplotlib.pyplot as plt
#导入第三方库
fe = np.array([[1.9,2.0],
[1.7,2.5],
[1.6,3.1],
[0.1,0.1],
[0.8,0.3],
[0.4,0.3],
[0.22,0.1],
[0.4, 0.3],
[0.4,0.5],
[1.8,1.9]])
#定义待聚类变量集
book = np.array((fe[0], fe[1]))
print(type(book))
print("book: n",book)
codebook, distortion = kmeans(fe, book)
print("codebook:", codebook)
print("distortion: ", distortion)
plt.scatter(fe[:,0], fe[:,1], c='g')
plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
plt.show()
#将聚类结果显示在坐标系内
结果为:
其中,红色为聚类中心。
二、聚类色彩提取实例
(一)PIL提取色彩
本代码利用PIL对图片进行色彩提取,并将色彩出现频率进行排序,输出特定序列的颜色。
待分析图片如下:
代码如下:
from PIL import Image, ImageDraw, ImageFont
#引入第三方库
def get_dominant_colors(infile):
#定义获取图片颜色的函数
image = Image.open(infile)
#读取图片
small_image = image.resize((80, 80))
#缩小图片,减少计算量
result = small_image.convert("P", palette=Image.ADAPTIVE, colors=5)
#获取图片中5个主要的颜色
palette = result.getpalette()
color_counts = sorted(result.getcolors(), reverse=True)
colors = list()
#对颜色进行排序
for i in range(5):
palette_index = color_counts[i][1]
dominant_color = palette[palette_index * 3 : palette_index * 3 + 3]
colors.append(tuple(dominant_color))
#定义颜色数据输出的格式
return colors
image_path = "pic.jpg"
color = get_dominant_colors(image_path)
#输入具体的待处理图片
print(color)
结果如下:
(二)对图片进行聚类
首先利用PIL将图片进行缩略处理,然后再缩略图上进行聚类。
代码如下:
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
im=np.array(Image.open('pic.jpg'))
#用缩略图聚类
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)
plt.axis('off')
plt.imshow(img)
plt.show()
points=[]
for count,color in img.getcolors(w*h):
points.append(color)
return points
colorz('pic.jpg',3)
结果如下:
(三)对色彩聚类
代码如下:
import numpy as np
from scipy.cluster.vq import vq, kmeans, whiten
import matplotlib.pyplot as plt
from PIL import Image
#用缩略图聚类
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)
plt.axis('off')
plt.imshow(img)
plt.show()
points=[]
for count,color in img.getcolors(w*h):
points.append(color)
return points
points=colorz('pic.jpg',3)
print(points[0:10])
fe = np.array(points,dtype=float) #聚类需要是Float或者Double
print(fe[0:10])
book =np.array((fe[100],fe[1],fe[8],fe[8])) #聚类中心,初始值
print(type(book))
print("book: n",book)
#codebook, distortion = kmeans(fe,book)
codebook, distortion = kmeans(fe,7) #7是聚类中心个数
# 可以写kmeans(wf,2), 2表示两个质心,同时启用iter参数
print("codebook:", codebook) #聚类中心
centers=np.array(codebook,dtype=int) #变为色彩,还得转为整数
print(centers)
print("distortion: ", distortion)
fe=np.array(points)
plt.scatter(fe[:,0], fe[:,2], c='b')
plt.scatter(codebook[:, 0], codebook[:,2], c='r') #聚类中心
plt.show()
结果如下:
三、聚类+Flask
(一)定义网页样式
代码如下:
帧数: {{framecount}}
{{imgcolors}}
{% for c in imgcolors %} 长津湖 {% endfor %}
结果如下:
(二)聚类程序代码实现
代码如下:
import numpy as np
from PIL import Image
from scipy.cluster.vq import vq, kmeans, whiten
from flask import Flask,render_template,request
import imageColor
#导入第三方库
app=Flask(__name__)
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)
return points
#定义色彩函数
def kmeansColor(img,n):
points=colorz(img,3)
fe = np.array(points,dtype=float)
codebook, distortion = kmeans(fe,n)
centers=np.array(codebook,dtype=int)
return centers
#定义聚类函数
@app.route('/')
def index():
#return "Hi,Flask!"
#genframe()
pic='static/pic/image'
framecount=249
imgcolors=imageColor.kmeansColor('static/pic/image0.jpg',5)
return render_template('index.html',pic1=pic,framecount=framecount,imgcolors=imgcolors)
#将程序结果加载到网页端
if "__main__"==__name__:
app.run(port="5008")
#运行程序
结果如下:



