目录
一、聚类分析
1、聚类
2、Scipy中的聚类算法(K-Means)
3、聚类示例
?完整代码:
运行结果:
函数使用:
二、图像色彩聚类
操作步骤:
完整代码:
运行结果:
三、合并至Flask软件
部分代码:
运行结果:
一、聚类分析
1、聚类
聚类是把相似数据并成一组(group)的方法。不需要类别标注,直接从数据中学习模式。
2、Scipy中的聚类算法(K-Means)
- ? 随机选取K个数据点作为“种子”
- ? 根据数据点与“种子”的距离大小进行类分配
- ? 更新类中心点的位置,以新的类中心点作为“种子”
- ? 按照新的“种子”对数据归属的类进行重新分配
- ? 更新类中心点(-->3-->4),不断迭代,直到类中心点变得很小
3、聚类示例
?完整代码:
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])) #N维数组对象
print("book: \n",book)
codebook, distortion = kmeans(fe, book)
print("codebook: \n", codebook)
print("distortion: ", distortion)
plt.scatter(fe[:,0], fe[:,1], c='g') #展示聚类子集内的样本点
plt.scatter(codebook[:, 0], codebook[:, 1], c='r') #展示各聚类子集的中心
plt.show()
运行结果:
(红点为聚类中心/质心)?
函数使用:
kmeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, ?copy_x=True, n_jobs=None, algorithm='auto')
n_clusters? ? ? ? k值,生成的聚类数,即产生的质心(centroids)数
max_iter????????最大迭代次数(如果数据集不是凸集,可能很难收敛,可以通过指定最大的迭代次数让算法可以及时退出循环)
n_init????????使用不同的初始化质心运行算法的次数(k值较大时,可以适当增大这个值)
二、图像色彩聚类
操作步骤:
- 用resize或者thumbnail生成缩略图
getcolors()返回图像的色彩和频次- 聚类分析并生成示意图
完整代码:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from scipy.cluster.vq import vq, kmeans, whiten
im=np.array(Image.open('hm.jpg'))
def colorz(filename):
img=Image.open(filename)
img.thumbnail((200,200)) #thumbnail后的图片保持原有长宽比例,resize后的图片为设置的比例
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('hm.jpg')
fe = np.array(points,dtype=float) #聚类需要Float或者Double
book =np.array((fe[100],fe[1],fe[8],fe[8])) #聚类中心,初始值
print("book: \n",book)
codebook, distortion = kmeans(fe,7) #7是聚类中心个数
print("codebook:\n", codebook) #聚类中心
centers=np.array(codebook,dtype=int) #变为色彩,需要转为整数
print("distortion: ", distortion)
plt.scatter(fe[:,0], fe[:,2], c='b')
plt.scatter(codebook[:, 0], codebook[:,2], c='r')
plt.show()
运行结果:
(七个聚类中心)
三、合并至Flask软件
部分代码:
from flask import Flask,render_template,request
import imageColor
import numpy as np
from PIL import Image
from scipy.cluster.vq import vq, kmeans, whiten
import os
app=Flask(__name__)
def colorz(filename,n=3):
img=Image.open(filename)
img=img.rotate(-90)
img.thumbnail((200,200))
w,h=img.size
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():
picname=request.args.get("picname", type=str)
if not picname:
picname='static/hash/image0.jpg'
pic='static/hash/image'
imgcolors = imageColor.kmeansColor(picname, 5)
path = 'static/hash'
filename = os.listdir(path)
framecount = len(filename)
filename.sort(key=lambda x: int(x[5:-4]))
return render_template('index.html',pic1=pic,imgcolors=imgcolors,filename=filename,framecount=framecount)
if "__main__"==__name__:
app.run(port="5008")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask分镜</title>
</head>
<body style="background-color:#74759b">
视频分镜
<br>
<video width="640" height="480" controls autoplay>
<source src="static/ghz.mp4" type="video/mp4">
<object data="static/ghz.mp4" width="640" height="480">
<embed width="640" height="480" src="static/ghz.mp4">
</object>
</video>
<br>
哈希分镜帧数:{{framecount}}<br>
{{imgcolors}}<br>
{% for c in imgcolors %}
<font style="color:rgb({{c[0]}},{{c[1]}},{{c[2]}})">图像色彩</font>
{% endfor %}
<br>
{% for i in range(framecount) %}
<a href="/?picname=static/hash/{{filename[i]}}"><img height="40" src="static/hash/{{filename[i]}}" /></a>
{{filename[i]}}
{% endfor %}
</body>
</html>
运行结果:
(点击分镜头图像,即可显示对应的聚类图像色彩)?
|