1.はじめに
以前から画像を鉛筆画に変換する手法はありましたが、今回はその制作プロセスも含めて生成する手法をご紹介します。
*この論文は、2020.12に提出されました。
2.手法
この手法の新しいところは、単に画像から鉛筆画を生成するだけでなく、その制作プロセスを生成できるところにあります。
下記は全体のフレームワークです。入力 I が、3つのブランチ( ETF, Q, G )に入り、合成されて最終出力 R を得ます。
1つ目のブランチは、ETF (Edge Tangent Flow)処理 によって画像の特徴抽出をしっかり行った後に、画面を並行な線が引ける領域に分割します。
2つ目のブランチは、量子化(アナログをデジタル化)したQを求め、1つ目で分割した領域毎にピクセルの明度から線を引く幅を決定し、平行線を引いて行きます。
線を引く順番は下記のスコアSが大きい順で、ここでGは明度、Tiは領域D内のピクセルの勾配です。これによって、画家がくっきりした輪郭を先に描くという動きを真似ることができます。
3つ目のブランチは、並行線だけでは境界部分がボケてしまうため、勾配マップGからエッジを抽出して最後に乗算する処理を行っています。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。
1 2 3 |
# githubからコードをコピー !git clone https://github.com/cedro3/Sketch-Generation-with-Drawing-Process-Guided-by-Vector-Flow-and-Grayscale.git %cd Sketch-Generation-with-Drawing-Process-Guided-by-Vector-Flow-and-Grayscale |
下記のコードで、inputフォルダーにある画像から選んで、スケッチプロセスを静止画に変換します。7行目で画像の指定、8・9行目はパラメータ指定です。
1 2 3 4 5 6 7 8 9 10 11 12 |
# ------ スケッチプロセスを静止画に変換 ------ from draw import * from PIL import Image import glob # setting file_name = 'kasumi.png' # inputフォルダーにある画像名の指定 n = 10 # グレースケール量子化次数 period = 5 # 線(ストローク)幅 # drawing draw(file_name, n, period) |
生成した静止画は、output/kasumi/process に保存されますので、これらを ffmpeg で mp4動画に変換します。
ffmpegの仕様のため、お手数ですが、必要に応じて output/***/process/%04d.jpg と output/***/out.mp4 の***部分を修正してから、コードを実行して下さい。
1 2 3 4 |
# ------ 静止画をmp4に変換 ------ # 必要に応じて、output/***/process/%04d.jpg と output/***/out.mp4 の***部分を修正して下さい。 !ffmpeg -r 30 -i output/kasumi/process/%04d.jpg -vcodec libx264 -pix_fmt yuv420p output/kasumi/out.mp4 |
生成したmp4動画は、output/kasumi/out.mp4 に保存されます。それでは、下記のコードで、インラインで再生してみましょう。
1 2 3 4 5 6 7 8 9 10 |
# ------ mp4の再生 ------ from IPython.display import HTML from base64 import b64encode mp4 = open('./output/'+file_name[:-4]+'/out.mp4', 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="50%" height="50%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
下記のコードを実行して、変換前後の画像を比較してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# ------ 変換前後の画像比較 ------ import cv2 import numpy as np import matplotlib.pyplot as plt img1 = cv2.imread('./output/'+file_name[:-4]+'/input.jpg') src1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) img2 = cv2.imread('./output/'+file_name[:-4]+'/result_RGB.jpg') src2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB) fig = plt.figure(figsize=(15,15)) plt.subplot(1,2,1) plt.imshow(src1), plt.title('input') plt.axis('off') plt.subplot(1,2,2) plt.imshow(src2), plt.title('generated') plt.axis('off') plt.show() |
file_name = ‘satomi2.png’ に変更して順次コードを実行すると、
file_name = ‘erika.png’ に変更して順次コードを実行すると、
けっこう良い感じに仕上がります。
では、また。
(オリジナルgithub)https://github.com/TZYSJTU/Sketch-Generation-with-Drawing-Process-Guided-by-Vector-Flow-and-Grayscale
(Twitterへの投稿)
コメントを残す