コードで素敵な絵を描く方法

序文

コンピューター技術の発展に伴い、コンピューターの強力な機能を利用して塗装作業を非常に簡単に行うことができるようになりました。絵画作品のレベルもどんどん上がっていますが、プログラミング言語で描くことでどんな面白いものが作れるのか、人間の創作と比べて考えるべきことは何かを見ていきましょう。

ペインティング

コードで絵を描くのに似たものを出力する最も原始的な方法は、print 関数を直接使用することです。

出力文字を印刷する

def do_print():
    print('''

        へ     /|
      /\7    ∠_/
      / │   / /
     │ Z _,< /   /`ヽ
     │     ヽ   /  〉
      Y     `  /  /
     イ● 、 ●  ⊂⊃〈  /
     ()  へ    | \〈
      >ー 、_  ィ  │ //
      / へ   / ノ<| \\
      ヽ_ノ  (_/  │//
      7       |/
      >―r ̄ ̄`ー―_
     ''')

このメソッドを実行すると、コンソールに次のようなかわいいピカチュウの絵が表示されます。

画像の説明を追加してください

このアプローチは技術レベルが全く無いと言えます。何かを描きたい場合は、あらかじめキャラクターを配置しなければならず、面倒です。そのため、更新版があります。

画像から文字へ

このような絵を文字に変換することは無意味に思えるかもしれませんが、実は意外な作品が生まれることもあります。例えば、先ほどのトップストリーム氷橋。

画像の説明を追加してください

一般に、このアプローチのアイデアは、画像のサンプリングされた画像のピクセル情報を取得し、ピクセル情報のキーの明るさ情報を特別な文字列で出力することであり、その効果が最終的に表示されます.

public static void printImage(BufferedImage image) throws IOException {
    
    
    final char[] PIXEL_CHAR_ARRAY = {
    
    'W', '@', '#', '8', '&', '*', 'o', ':', '.', ' '};
    int width = image.getWidth();
    int height = image.getHeight();
    for (int i = 0; i < height; i++) {
    
    
        for (int j = 0; j < width; j++) {
    
    
            int rgb = image.getRGB(j, i);
            Color color = new Color(rgb);
            int red = color.getRed();
            int green = color.getGreen();
            int blue = color.getBlue();
            // 一个用于计算RGB像素点灰度的公式
            Double grayscale = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
            double index = grayscale / (Math.ceil(255 / PIXEL_CHAR_ARRAY.length) + 0.5);
            System.out.print(PIXEL_CHAR_ARRAY[(int)(Math.floor(index))]);
        }
        System.out.println();
    }
}

より具体的な実装については、キャラクター。キャラクターを使用して氷のくぼみを描きました。

Python-turtle ライブラリを使用した描画

次のいくつかの Zhihu ユーザーの回答は、非常に高レベルであると言えます。

import random
import turtle
from turtle import *

t = turtle.Turtle()
w = turtle.Screen()


def tree(branchLen, t):
    if branchLen > 3:
        if 8 <= branchLen <= 12:
            if random.randint(0, 2) == 0:
                t.color('snow')
            else:
                t.color('lightcoral')
            t.pensize(branchLen / 3)
        elif branchLen < 8:
            if random.randint(0, 1) == 0:
                t.color('snow')
            else:
                t.color('lightcoral')
            t.pensize(branchLen / 2)
        else:
            t.color('sienna')
            t.pensize(branchLen / 10)

        t.forward(branchLen)
        a = 1.5 * random.random()
        t.right(20 * a)
        b = 1.5 * random.random()
        tree(branchLen - 10 * b, t)
        t.left(40 * a)
        tree(branchLen - 10 * b, t)
        t.right(20 * a)
        t.up()
        t.backward(branchLen)
        t.down()


def petal(m, t):  # 树下花瓣
    for i in range(m):
        a = 200 - 400 * random.random()
        b = 10 - 20 * random.random()
        t.up()
        t.forward(b)
        t.left(90)
        t.forward(a)
        t.down()
        t.color("lightcoral")
        t.circle(1)
        t.up()
        t.backward(a)
        t.right(90)
        t.backward(b)


def main():
    t = turtle.Turtle()
    myWin = turtle.Screen()
    getscreen().tracer(5, 0)
    turtle.screensize(bg='wheat')
    t.left(90)
    t.up()
    t.backward(150)
    t.down()
    t.color('sienna')
    tree(60, t)
    petal(100, t)

    myWin.exitonclick()


if __name__ == '__main__':
    main()


おわかりのように、タートル ライブラリを数学的幾何学の深い知識とともに使用すると、非常に見栄えの良い画像を作成できます。詳細については、この

AIで絵を描く

ERNIE-ViLG Vincentチャート

上記のスキームを使用して描画されたコンテンツは、一般的により硬直的で、ヒューマニスティックな風味が欠けています。人間だけが持つことができる特性のいくつかが欠けています。しかし、AI の計算能力の向上とビッグデータの漸進的な発展に伴い、AI をペイントに使用できるプラットフォームはすでに数多く存在しています。たとえば、 Baidu Feizo Wenxin 大型モデル ERNIE-ViLG Wenshengtuプラットフォーム。

import wenxin_api
from wenxin_api.tasks.text_to_image import TextToImage
import secret


def draw(t, s):
    wenxin_api.ak = secret.ak
    wenxin_api.sk = secret.sk
    input_dict = {
    
    
        "text": t,
        "style": s
    }
    rst = TextToImage.create(**input_dict)
    print(rst)


if __name__ == '__main__':
    text = "夏天"
    style = "油画"
    draw(text, style)

上記のコードを使用すると、油絵風のを作成でき、AI が生成した結果を確認できます。

2022-08-28 12:20:06,785 - model is painting now!, 
- taskId: 1062408, waiting: 30s
{
    
    'imgUrls': ['https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fex', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fi4', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828f5q', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828f30', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fv9', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fa2']}

速度は依然として非常に速く、1 分もかからずに完了することがわかります。結果をプレビューできます






まだまだ威力が高く、レベルは短大卒に追いつけそうな勢いだが、塗りの速さは次元削減の一撃だ。

ERNie-Vi​​LG とカスタム キーワードを使用すると、水彩画、油絵、チョーク画、漫画、クレヨン画、子供の絵など、さまざまなスタイルの画像を生成できます。

天龍巴布を水彩風にもう一度お試しいただけます






まだまだという感じでしょうか。

AND 2 から

もちろん、AI塗装に関しては外資系大手もいます。OpenAIDALL・E2など。

たとえば、現実的なスタイルで馬に乗っている宇宙飛行士のイメージを作成します。

画像の説明を追加してください

鉛筆画のスタイルを変える

画像の説明を追加してください

DALL・E 2を使えば、クリエイティブスタイルやより多くのキーワードに応じて、AIによって非常に想像力豊かな作品を作成できます。詳しくはDALL・E 2のホームページをご覧ください。

要約する

実際、コードを使用してグラフィックスを直接描画する方法は他にもたくさんあります。たとえば、有名な MATLAB は非常に洗練された数学的幾何学を作成できます。

しかし、上記のスキームを比較すると、AIペイントのレベルが一気に数レベル向上したと言えます。創造に必要な入力は、ますます明確に、簡潔に、より人間味のあるものになっています。しかし、そのアウトプットの内容は人間のレベルに近づき、さらにはそれを超え始めています。

参考資料

おすすめ

転載: blog.csdn.net/TOYOTA11/article/details/126575202