カメ ライブラリの描画: QQ 絵文字を描画する リソース リンクは右側にあります:カメ ライブラリの描画: QQ 絵文字を描画する
実装のアイデア
本旨
タートル ブラシは画像マトリックス上をスライドし、pencolor() 関数によってペンの色を現在のピクセルの RGB 値に設定し、一定の距離を描画した後、次のピクセルの距離を取得して描画を続けます。
向上
ピクセルごとに描画するため、表現全体の描画時間は比較的長くなりますが、さらに描画速度を向上させるために、描画前に事前判定処理を追加しています。連続する 5 ピクセルの平均 RGB <=0.9 の場合、これら 5 つのピクセル点はそれぞれ描画され、そうでない場合は次の 5 つのピクセル点の事前判定が実行されます。事前判定を追加すると、一部の背景ピクセルの描画が減り、時間を節約できます。
オプションのパラメータと推奨設定
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抽出を行うことで、事前判定閾値の自動設定を実現し、プログラムの適用可能な画像範囲を拡大します。