Pythonでドット絵を作ろう!
こんばんは、アリカです。
本日はPythonを使ってドット絵を作成してみたいと思います。
と言うのも、先日ふとアイコンを変えようと思ったのですが私はドット絵が好きなのでPythonで作れないのかなと思い調べてみると、なんとこれが作れるとのことだったので実際にやってみました。
yolov8という最新の物体検出アルゴリズムを使ってリアルタイムの物体検知を行っています。
画像処理に興味がある方は是非こちらの動画も是非ご確認ください!
テキストVer
ドット絵とは
まずはじめにドット絵の定義を確認すると、
とのことでした。
要するに解像度を低くすればよいので、画像を拡大して解像度を落としサイズを元に戻してあげればよさそうですね。
実際にやってみよう
それでは実際にやってみます。
Pythonで画像を処理するときはopencvを使います。
以下がコードとなります。
import cv2
import numpy as np
def mosaic(img, alpha):
h, w, ch = img.shape
img = cv2.resize(img,(int(w*alpha), int(h*alpha)))
img = cv2.resize(img,(w, h), interpolation=cv2.INTER_NEAREST)
return img
img = cv2.imread(読み込む画像のパスを絶対パスで)
dst = mosaic(img, 0.2)
cv2.imwrite(出力する画像のパスを絶対パスで, dst)
出力結果を確認すると、こんな感じになりました。
結構それっぽい気がします :->
ちなみに元の画像はこれです。
※コードを書く際には注意点があります。
opencvはpipでインストールする必要がありますが、
pip install opencv-python
pipのバージョンが低いとインストールができないのでアップグレードする必要があります。
pip install --upgrade pip
また、画像のパスを指定するときに、パスの中に日本語が入っているとうまくいきません。
パスの一例
r"C:\Users\Desktop\icon.png
減色処理もしてみる
これで終わりでも良いのですが次に減色処理をしてみます。
ドット絵は8bitと言われることもあり、256色(RGB=8×8×8)で描くのが一般的だそうです。
ちなみに普段のイラストはRGB=256×256×256の約1677万色となっています :-O
以下がコードとなります。
import numpy as np
import cv2
def decreaseColor(img):
dst = img.copy()
idx = np.where((0<=img) & (32>img))
dst[idx] = 16
idx = np.where((32<=img) & (64>img))
dst[idx] = 48
idx = np.where((64<=img) & (96>img))
dst[idx] = 80
idx = np.where((96<=img) & (128>img))
dst[idx] = 112
idx = np.where((128<=img) & (160>img))
dst[idx] = 144
idx = np.where((160<=img) & (192>img))
dst[idx] = 176
idx = np.where((192<=img) & (224>img))
dst[idx] = 208
idx = np.where((224<=img) & (256>=img))
dst[idx] = 240
return dst
img = cv2.imread(読み込む画像のパスを絶対パスで)
img = decreaseColor(img)
cv2.imwrite(出力する画像のパスを絶対パスで, img)
出力結果を確認します。
右側の画像が減色処理後になります。
画像が悪いのかあまり変わった気がしませんね :-|
最後に減色処理をしてドット絵を作ります。
import cv2
import numpy as np
def mosaic(img, alpha):
h, w, ch = img.shape
img = cv2.resize(img,(int(w*alpha), int(h*alpha)))
img = cv2.resize(img,(w, h), interpolation=cv2.INTER_NEAREST)
return img
def decreaseColor(img):
dst = img.copy()
idx = np.where((0<=img) & (32>img))
dst[idx] = 16
idx = np.where((32<=img) & (64>img))
dst[idx] = 48
idx = np.where((64<=img) & (96>img))
dst[idx] = 80
idx = np.where((96<=img) & (128>img))
dst[idx] = 112
idx = np.where((128<=img) & (160>img))
dst[idx] = 144
idx = np.where((160<=img) & (192>img))
dst[idx] = 176
idx = np.where((192<=img) & (224>img))
dst[idx] = 208
idx = np.where((224<=img) & (256>=img))
dst[idx] = 240
return dst
img = cv2.imread(読み込む画像のパスを絶対パスで)
img2 = mosaic(img, 0.2)
img3 = decreaseColor(img2)
cv2.imwrite(出力する画像のパスを絶対パスで, img3)
最終的にこんな感じになりました。
さらに色を減らすとこんな感じです。
色々と調整できると思うので気になった方は是非やってみてね :-)
最後に
本日はここまでとなります。
今日は気づいたらプログラミングではなくドット絵の勉強をしていました(笑)
最後まで読んでいただきありがとうございました。
スキ・フォロー・コメントお待ちしております!
OpenCVを体系的に学びたい方にはオススメです。
この記事が気に入ったらサポートをしてみませんか?