Scipy-kmeans聚类色彩提取

Scipy-kmeans聚类色彩提取,第1张

Scipy-kmeans聚类色彩提取

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")

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5480164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存