見出し画像

Pythonでドット絵を作ろう!

こんばんは、アリカです。

本日はPythonを使ってドット絵を作成してみたいと思います。

と言うのも、先日ふとアイコンを変えようと思ったのですが私はドット絵が好きなのでPythonで作れないのかなと思い調べてみると、なんとこれが作れるとのことだったので実際にやってみました。


yolov8という最新の物体検出アルゴリズムを使ってリアルタイムの物体検知を行っています。
画像処理に興味がある方は是非こちらの動画も是非ご確認ください!

テキストVer


ドット絵とは

まずはじめにドット絵の定義を確認すると、

ドット絵とは、主としてコンピュータ上における画像の表現方法・作成方法の一形態であり、表層的には通常の目視でピクセルが判別できる程度に解像度が低いビットマップ画像と捉えることができる。ピクセルアート(英: pixel art)とも呼ばれる。

Wikipediaより引用

とのことでした。
要するに解像度を低くすればよいので、画像を拡大して解像度を落としサイズを元に戻してあげればよさそうですね。

実際にやってみよう

それでは実際にやってみます。
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を体系的に学びたい方にはオススメです。

この記事が気に入ったらサポートをしてみませんか?