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