社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

2021来了,用Python换一张头像到新年!

机器学习算法与Python学习 • 4 年前 • 434 次点击  




点击 机器学习算 法与Python学习 选择加星标

精彩内容不迷路


新的一年,新气象。


不少人都会选择换一个微信头像,迎接新的一年。


这期小F就来教大家,如何使用Python生成emoji风格的头像。


效果大致如下图,由很多的emoji图片方块组成一张新的头像图片



细节图~



主要是通过matplotlib、pillow和numpy这三个库来实现的。


import matplotlib.pyplot as plt
from scipy import spatial
from PIL import Image
import numpy as np


对于numpy和matplotlib(以及几乎所有的图像处理库)而言,图像基本上只是一个矩阵(例如A),其中每个像素(p)都是A的元素。


如果是灰度图像,则每个像素(p)只是一个数字(或标量)。如果为浮点数,则为[0, 1]。如果为整数,则为[0, 255]。


如果不是灰度级(例如在这次的情况下),则每个像素都是尺寸为3-红色(R),绿色(G)和蓝色(B)或尺寸为4-RGBA的矢量(A代表Alpha,表示的是透明度)。


首先读取图像,并且将图像尺寸缩小。


# 读取图片,并且修改图片大小
G_sm = np.array(Image.open( fans.png ).resize([50, 50]).getdata()).reshape([50503])/256

# 显示图片
plt.figure()
plt.imshow(G_sm)
plt.title( Original Image )
plt.show()


然后读取emoji图像数据,一共是有近1600个emoji图像数据。


# 读取emoji数据
emoji_array = np.load("emojis_16.npy")

# 获取emoji的平均颜色值
emoji_mean_array = np.array([ar.mean(axis=(0,1)) for ar in emoji_array]) 

# 将得到的每个emoji平均颜色值存储在树中以加快搜索速度
tree = spatial.KDTree(emoji_mean_array)


整个图像的平均颜色计算公式如下。



np.load,读取磁盘数组数据的函数,通常数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。


indices = []
# 平整数组,一维
flattened_img = G_sm.reshape(-1, G_sm.shape[-1])
print(flattened_img.shape)

# 匹配最相似的表情符号的像素
for pixel in flattened_img:
    pixel_ = np.concatenate((pixel, [1]))
    # 查询最近的索引
    _, index = tree.query(pixel_)
    indices.append(index)


将原图上每个像素点的颜色均值和emoji的颜色均值配对上。





    

# 从索引中获取对应的表情符号
emoji_matches = emoji_array[indices]

# 获取图片的高度
dim = G_sm.shape[0]
print(dim)

# 设置最终生成图像的大小,每个表情符号的形状都是(16,16,4),R, G, B, alpha
resized_ar = emoji_matches.reshape((dim, dim, 1616,4))


设置生成图像的大小,每个emoji图片的大小设置成16*16。


# 转换单个表情符号补丁(5维)
# 使用numpy块生成完整的图像(三维)
final_img = np.block([[[x] for x in row] for row in resized_ar]) 


生成最终结果图像,并且保存。


# 设置画布
plt.figure()
# 去除坐标轴
plt.axis( off )
# 显示图片
plt.imshow(final_img)

# 保存emoji马赛克风格图像,去除白边
plt.savefig( image_emoji.png , bbox_inches="tight", pad_inches=0.0)
plt.show()


通过设置plt.savefig的参数,去除图像白边,保存图片。


下面就使用小F的微信头像为例,来实验一波~



生成的emoji图看起来不是很细腻,可以设置一下图片参数为100。


G_sm = np.array(Image.open( weixin.png ).resize([100 100]).getdata()).reshape([1001003])/256


得到结果如下。



看起来还不错,大家伙也可以使用自己喜欢的头像去生成~


    你点的每个“在看”,我都认真当成了AI

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/105923
 
434 次点击