キノコが何か作るブログ

ゲーム・ドット絵・アプリなどを作ります

MENU

画像をドット絵に変換する方法を考える

自分が描いた絵や撮った写真をドット絵に変換できれば、ゲーム素材作りが楽になると前々から思っていました。
ただ、めんどくさいしどうやったらそんなことできるのか、全く見当も付かなかったのでずっと放置していたんですが、今回重い腰をあげて画像をドット絵に変換する方法を模索してみようと思います。

8近傍で平均してみる

無理だと思いましたが、3x3を1ピクセルとして、8近傍で取った画素値の平均をそこにブチ込んだらそれっぽくならないかな〜と思ったのでやってみました。

以下ソースコード

#coding: utf-8

import cv2
import numpy as np

#画像読み込み
img = cv2.imread('sample.png');

height, width, ch = img.shape

for c in range(ch):
    for y in range(1, height-1, 3):
        for x in range(1, width-1, 3):
            pixels = np.zeros(9)
            pixels[0] = img[y, x, c]
            pixels[1] = img[y-1, x, c]
            pixels[2] = img[y+1, x, c]
            pixels[3] = img[y, x-1, c]
            pixels[4] = img[y, x+1,c]
            pixels[5] = img[y-1, x-1, c]
            pixels[6] = img[y-1, x+1, c]
            pixels[7] = img[y+1, x-1, c]
            pixels[8] = img[y+1, x+1, c]

            #9マスの平均画素値を出す
            mean_pixels = np.mean(pixels)

            #画素値を代入
            img[y, x, c] = mean_pixels
            img[y-1, x, c] = mean_pixels
            img[y+1, x, c] = mean_pixels
            img[y, x-1, c] = mean_pixels
            img[y, x+1,c] = mean_pixels
            img[y-1, x-1, c] = mean_pixels
            img[y-1, x+1, c] = mean_pixels
            img[y+1, x-1, c] = mean_pixels
            img[y+1, x+1, c] = mean_pixels

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.imwrite('dot1.png', img)

酷いソースコードで申し訳ないです。Pythonの書き方すっかり忘れました。

以下実行結果

f:id:mizukinoko:20201006100206p:plain
元画像1
f:id:mizukinoko:20201006100215p:plain
変換後1
f:id:mizukinoko:20201006100240j:plain
元画像2
f:id:mizukinoko:20201006101430j:plain
変換後2

あんまり変わらないです。ちょっとぼやけた感じですが、2枚目に関しては色が薄くなったくらいしかわからないです。
畳み込んだらもっと荒くはなりますが、モザイクとそんなに変わんないです。
解像度が低くなればドット絵ぽくなるかと思いましたが、さすがにだめでした。

そもそもドット絵に変換できるのか

そもそも論なんですが、普通の画像をドット絵に変換できるのかって話です。
僕が思うドット絵変換というのは、
例えばこの彼岸花の画像を

tigers1964さんによる写真ACからの写真
 ↓変換↓
f:id:mizukinoko:20201006142753p:plain
(これは自分で描いたやつ)
このようなドット絵に変換するということです。

これは純粋な画像処理だけだと不可能な気がします。
画像をデフォルメしてドット絵に落とし込むという作業は、それこそDeepLearningを使ってやるしかないんじゃないかと思います。

でも、ドット絵風に加工するやつは作れるかもしれません。
ヒストグラムの分布を見て、よく使われている色を抽出して色数を絞ればドット絵っぽくなるかもしれません。
でも僕がやりたいこととは違うので今のところやるつもりはないです。やりたくなったらやります。

Deep Unsupervised Pixelization

自分のやりたいことをすでにやってる論文がありました。
それが「Deep Unsupervised Pixelization」という論文です。
Deep Unsupervised Pixelization

構造は複数のCNNをつなげたもののように見えます。まだちゃんと読めてないので間違っていたらすみません。でも見た感じ畳み込みと逆畳み込みの間にResNetのブロックがあるCNNだと思います。
ネットワークの構造を引用したかったのですが、この記事だと引用先との主従関係がはっきりしないのでやめておきます。気になる方はリンク先から論文を読んでみてください。Fig.3がネットワークの構造を表した図です。
Deep Unsupervised Pixelization


これが使えれば自分の思っていたことができそうです。
パソコンのスペックが足りない気がしますが、とりあえずやってみてダメだったら別の方法を考えようと思います。
それでは。

プライバシーポリシー