third
问题:已经使用mm进行数据拟合转换了,为何还要使用np.mat()转换呢?作用在哪里?方便后面使用np.uint8吗?
注意:实战的时候,保存图片为jpg格式
如果是png格式的话,会出现4个值,导致赋值错误,(R, G, B, A)
import PIL.Image as image
import numpy as np
import pandas as pd
#载入数据
def load_data(file):
with open(file,'rb') as f:
data=[]
#打开文件
img=image.open(f)
width,height=img.size
#获取特征数据
for x in range(width):
for y in range(height):
c1,c2,c3=img.getpixel((x,y))
data.append([c1,c2,c3])
#进行mm规范化
from sklearn.preprocessing import MinMaxScaler
mm=MinMaxScaler()
data=mm.fit_transform(data)
return np.mat(data),width,height
data,width,height=load_data('./27/baby.jpg')
#进行聚类
from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=16)
label=kmeans.fit_predict(data)
#可视化
#转换成图像矩阵
label=label.reshape([width,height])
#生成一张新图片
# pic_1=image.new("L",(width,height))
# #把像素信息写入
# #方法1写入灰度值
# for x in range(width):
# for y in range(height):
# #按照分类确定灰度值
# pic_1.putpixel((x,y),int(label[x][y]*256/16))
# pic_1.save('./27/baby.jpg')
# #方法2
# # 使用模组,将表示矩阵转换为各种颜色的矩阵
# #使用label2rgb(label)*255转化,再把矩阵转化为unit8类型,无符号整数
# from skimage import color
# label_color=(color.label2rgb(label)*255).astype(np.uint8)
# #似乎都需要进行颠倒处理
# label_color=label_color.transpose(1,0,2)
# #使用fromarray把矩阵生成图片
# images=image.fromarray(label_color)
# images.save('./27/baby_color_2.jpg')
#方法3获取对应原图
#创建新的图片
imges1=image.new('RGB',(width,height))
#写入图片
for x in range(width):
for y in range(height):
#吧范围为0-255的数值投射到1-256
#获取第一列即r的值
c1=kmeans.cluster_centers_[label[x,y],0]
c2 = kmeans.cluster_centers_[label[x, y], 1]
c3 = kmeans.cluster_centers_[label[x, y], 2]
imges1.putpixel((x,y),(int(c1*256)-1,int(c2*256)-1,int(c3*256)-1))
imges1.save('./27/baby_yasuo.jpg')
编辑回复: 不用np.mat()也是OK的,jpg和png通道数确实需要注意。