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进行提取实现预判断阈值的自动设置,扩展程序适用的图像范围。