天天看點

turtle庫繪圖:繪制QQ所有表情實作思路具體代碼實作效果可完善方向

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

實作效果

turtle庫繪圖:繪制QQ所有表情實作思路具體代碼實作效果可完善方向

可完善方向

本文實作了對表情的繪制,為節約部分圖像的繪制時間進行了預判斷,設定部分參數可選,若讀者有興趣,可以引入圖像去噪算法,實作對表情的高清繪制,同時對整體背景RGB進行提取實作預判斷門檻值的自動設定,擴充程式适用的圖像範圍。