2021來了,用Python換一張頭像到新年!
新的一年,新氣象。
不少人都會選擇換一個微信頭像,迎接新的一年。
這期小F就來教大家,如何使用Python生成emoji風(fēng)格的頭像。
效果大致如下圖,由很多的emoji圖片方塊組成一張新的頭像圖片

細(xì)節(jié)圖~

主要是通過matplotlib、pillow和numpy這三個庫來實現(xiàn)的。
import?matplotlib.pyplot?as?plt
from?scipy?import?spatial
from?PIL?import?Image
import?numpy?as?np
對于numpy和matplotlib(以及幾乎所有的圖像處理庫)而言,圖像基本上只是一個矩陣(例如A),其中每個像素(p)都是A的元素。
如果是灰度圖像,則每個像素(p)只是一個數(shù)字(或標(biāo)量)。如果為浮點數(shù),則為[0, 1]。如果為整數(shù),則為[0, 255]。
如果不是灰度級(例如在這次的情況下),則每個像素都是尺寸為3-紅色(R),綠色(G)和藍(lán)色(B)或尺寸為4-RGBA的矢量(A代表Alpha,表示的是透明度)。
首先讀取圖像,并且將圖像尺寸縮小。
#?讀取圖片,并且修改圖片大小
G_sm?=?np.array(Image.open('fans.png').resize([50, 50]).getdata()).reshape([50,?50,?3])/256
#?顯示圖片
plt.figure()
plt.imshow(G_sm)
plt.title('Original?Image')
plt.show()
然后讀取emoji圖像數(shù)據(jù),一共是有近1600個emoji圖像數(shù)據(jù)。
#?讀取emoji數(shù)據(jù)
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,讀取磁盤數(shù)組數(shù)據(jù)的函數(shù),通常數(shù)組是以未壓縮的原始二進(jìn)制格式保存在擴(kuò)展名為.npy的文件中。
indices?=?[]
#?平整數(shù)組,一維
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的顏色均值配對上。
#?從索引中獲取對應(yīng)的表情符號
emoji_matches?=?emoji_array[indices]
#?獲取圖片的高度
dim?=?G_sm.shape[0]
print(dim)
#?設(shè)置最終生成圖像的大小,每個表情符號的形狀都是(16,16,4),R,?G,?B,?alpha
resized_ar?=?emoji_matches.reshape((dim,?dim,?16,?16,4))
設(shè)置生成圖像的大小,每個emoji圖片的大小設(shè)置成16*16。
#?轉(zhuǎn)換單個表情符號補丁(5維)
#?使用numpy塊生成完整的圖像(三維)
final_img?=?np.block([[[x]?for?x?in?row]?for?row?in?resized_ar])?
生成最終結(jié)果圖像,并且保存。
#?設(shè)置畫布
plt.figure()
#?去除坐標(biāo)軸
plt.axis('off')
#?顯示圖片
plt.imshow(final_img)
#?保存emoji馬賽克風(fēng)格圖像,去除白邊
plt.savefig('image_emoji.png',?bbox_inches="tight",?pad_inches=0.0)
plt.show()
通過設(shè)置plt.savefig的參數(shù),去除圖像白邊,保存圖片。
下面就使用小F的微信頭像為例,來實驗一波~

生成的emoji圖看起來不是很細(xì)膩,可以設(shè)置一下圖片參數(shù)為100。
G_sm?=?np.array(Image.open('weixin.png').resize([100,?100]).getdata()).reshape([100,?100,?3])/256
得到結(jié)果如下。

看起來還不錯,大家伙也可以使用自己喜歡的頭像去生成~
公眾號回復(fù)「頭像」,即可獲取使用到的代碼以及相關(guān)文件。
萬水千山總是情,點個點 ???行不行。
程序員GitHub,現(xiàn)已正式上線! 接下來我們將會在該公眾號上,專注為大家分享GitHub上有趣的開源庫包括Python,Java,Go,前端開發(fā)等優(yōu)質(zhì)的學(xué)習(xí)資源和技術(shù),分享一些程序員圈的新鮮趣事。
年度爆款文案
6).30個Python奇淫技巧集?
點這里,獲取新手福利


