turtle庫繪圖:繪制QQ所有表情
- 實作思路
-
- 主體思路
- 改進
- 可選參數及推薦設定
- 具體代碼
- 實作效果
- 可完善方向
turtle庫繪圖:繪制QQ表情資源連結如右:turtle庫繪圖:繪制QQ表情
實作思路
主體思路
turtle畫筆在圖像矩陣上進行滑動,通過pencolor()函數設定畫筆顔色為目前像素點的RGB值,繪制一段距離,然後擷取下一像素點的距離,繼續繪制。
改進
由于對每一個像素點進行繪制,整個表情的繪制時間會比較長,為進一步提升繪制速度,在繪制之前,加入一個預判斷的過程,若連續5個像素點的平均RGB<=0.9,才對這五個像素點分别進行繪制,否則進行下五個像素點的預判斷。預判斷的加入可以減少對部分背景像素點的繪制,節約部分時間。
可選參數及推薦設定
im:本地讀入的要繪制的表情圖檔
ps:繪制時的畫筆大小
stepsize:預判斷時的像素點設定
推薦讀入的表情圖檔分辨率小于250×250,畫筆大小<5,畫筆大小即為對原圖像的放大倍數,設定太大鋸齒感會十分明顯,同時畫筆大小與原圖像分辨率的乘積決定了繪圖視窗的大小,太大的話畫布會顯示不完整。
預判斷門檻值設定為0.9,即認為圖像中的背景像素點接近白色,故對于背景為其它顔色的圖像,該門檻值将不起作用,程式同樣能實作對這類圖像的繪制,隻不過不能節約繪制時間。
具體代碼
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 13 21:34:21 2018
@author: 魅夢
"""
import matplotlib.pyplot as plt
from turtle import *
import numpy as np
im = plt.imread('20201114102455.png')
speed(0)
# 設定畫筆大小
ps = 3
stepsize = 5
height, weight, deep = im.shape[0], im.shape[1], im.shape[2]
maincolor = np.mean(im.reshape(height*weight, deep), axis=0)
print(tuple(maincolor))
if im[0][0][0] > 1:
im = im/255
screensize(weight*ps, height*ps)
setup(weight*(ps + 1), height*(ps + 1))
for he in range(height):
for we in range(0, weight, stepsize):
if np.mean(im[he][we: we + stepsize]) <= 0.9:
up()
goto(ps*(we - weight/2), ps*(height/2 - he))
down()
for w in range(we, we + stepsize):
r, g, b = im[he][w][0], im[he][w][1], im[he][w][2]
pencolor(r.item(), g.item(), b.item())
pensize(ps)
forward(ps)
hideturtle()
done()
實作效果
可完善方向
本文實作了對表情的繪制,為節約部分圖像的繪制時間進行了預判斷,設定部分參數可選,若讀者有興趣,可以引入圖像去噪算法,實作對表情的高清繪制,同時對整體背景RGB進行提取實作預判斷門檻值的自動設定,擴充程式适用的圖像範圍。