【python】Scipy中的聚类算法

  1. 安装:pip install scipy

  2. 在jupyter中进行聚类示例

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)
print("distortion: ", distortion)

plt.scatter(fe[:,0], fe[:,1], c='g')
plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
plt.show()

得出结果

【python】Scipy中的聚类算法
  1. 小图片进行聚类

用PIL生成小尺寸的图片,在小图片上聚类

用resize或者thumbnail(缩略图)

import os
from PIL import Image
import matplotlib.pyplot as plt

os.chdir(r'/Users/liruiying/Documents/pythonclass2021/lesson5')
print(os.getcwd())
im = np.array(Image.open('girl.png'))

#用缩略图聚类
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('girl.png',3)

【python】Scipy中的聚类算法
  1. 对色彩进行聚类
#对色彩聚类
import numpy as np
from scipy.cluster.vq import vq, kmeans, whiten
import matplotlib.pyplot as plt

points=colorz('girl.png',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()

【python】Scipy中的聚类算法

【python】Scipy中的聚类算法
  1. 导入pycharm

将上列代码合并成ImageColor.py

import numpy as np
from PIL import Image
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)
    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
  1. 修改main.py

修改一:

from flask import Flask,render_template,request
#增加request
import os
import cv2
import imageColor
#导入imageColor

修改二:

@app.route('/')
def index():
    #return "Hi,Flask!"
    #genFrame()
    picname=request.args.get("picname", type=str)
    if not picname:
        picname='static/pic/image0.jpg'
    pic='static/pic/image'
    framecount=825
    #imgcolors=imageColor.kmeansColor('static/pic/image0.jpg',5)
    imgcolors = imageColor.kmeansColor(picname, 5)
    return render_template('index.html',pic1=pic,framecount=framecount,imgcolors=imgcolors)
  1. 修改index.html

增加以下代码


帧数:{{framecount}}
{{imgcolors}}
{% for c in imgcolors %}
宣传片
{% endfor %}

{% for i in range(framecount) %}

{% endfor %}
  1. 运行main.py得出结果

【python】Scipy中的聚类算法

点击每个图片,”宣传片”的颜色会根据图片颜色进行变化。

Original: https://blog.csdn.net/m0_61727550/article/details/121278026
Author: Ruiying1020
Title: 【python】Scipy中的聚类算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/550692/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球