一、 聚类示例kmeans聚类原理:对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
所以就算开始给定的聚类中心看上去非常离谱,样本与其之间的距离依然存在差距,仍可以被划分为不同类,经过不断优化后成为界限清晰的类别。
在写正式的程序之前,可以用简单数据做个demo
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) # 可以写kmeans(wf,2), 2表示两个质心,同时启用iter参数 print("codebook:", codebook) #codebook是聚类中心 print("distortion: ", distortion) #distortion控制方差大小,使其越来越小 plt.scatter(fe[:,0], fe[:,1], c='g') plt.scatter(codebook[:, 0], codebook[:, 1], c='r') plt.show()
二、对图像进行色彩聚类 1.生成缩略图
用PIL生成小尺寸的图片,在小图片上聚类
用resize或者thumbnail(缩略图)
import os from PIL import Image import matplotlib.pyplot as plt os.chdir(r'C:Users81244DesktopPython practice') im=np.array(Image.open('bear.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('bear.jpg',3)2.取出图像的色彩和频次
直接完整代码吧
import os.path from flask import Flask,render_template from PIL import Image import matplotlib.pyplot as plt import numpy as np from scipy.cluster.vq import vq, kmeans, whiten 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 def kmeansColor(img,n): points=colorz(img,3) fe = np.array codebook, distortion = kmeans() centers = np.array(codebook,dtype=float) return centers os.chdir(r'C:Users81244DesktopPython practice') points=colorz('bear.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出现了上面的报错……重启或者更改端口都解决不了,所以没有试验色彩聚类在flask里面的应用。
希望下次课前能解决,拜托拜托。
11.12补充
新建了project,然后可以运行了
from flask import Flask,render_template import os import cv2 import numpy as np import matplotlib.pyplot as plt from scipy.cluster.vq import vq, kmeans, whiten from PIL import Image app=Flask(__name__) def colorz(filename,n): 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 def kmeansColor(img,n): points = colorz(img, 3) fe = np.array(points, dtype=float) # 聚类需要是Float或者Double codebook, distortion = kmeans(fe, n) # 7是聚类中心个数 # 可以写kmeans(wf,2), 2表示两个质心,同时启用iter参数 centers = np.array(codebook, dtype=int) # 变为色彩,还得转为整数 return centers @app.route('/kmeancolor') def kmeancolor(): pic='static/shot/image' framecount=6 imgcolors=kmeansColor('static/shot/image0.jpg',5) #kmeansColor('static/pic/bear',7) print() return render_template('kmean.html',pic1=pic,framecount=framecount,imgcolors=imgcolors) if "__main__"==__name__: app.run(port="5008")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)