« 動画再生でサーバーエラーが出る場合の対処 | メイン | ドット絵拡大説明動画 »

2012年10月11日

ツール開発メモ/ドット絵:: ドット絵の拡大

    

ドット絵を拡大するときはだいたいニアレストネイバーで拡大して、ドットが残ったようにすることが多い。
バイリニア等他の補間方法で拡大すると汚くなってしまう。
ただ、ドットが残っているようなな拡大だと解像度が増していないので拡大する意味がない。
ドット絵のまま解像度を上げて拡大できないかということで試行錯誤してみた。
その結果が以下の動画。

動画にすればどう処理しているのかわかりやすくて楽しいものになると思ったけど、地味でよく分からない動画になった。
フルスクリーンにして見ると少しずつ角が取れて綺麗になっているのがわかる。
アルゴリズムは人がやる方法をできるだけ近似する方法をとっている。
手作業だと縦1ドット、横4ドットの領域を2倍に拡大する場合、4ドットの階段状にするのと綺麗になるのでそうするはず。
つまり、ドット境界で何ドット連続しているかとどちら向きに傾いているかを判定してその傾きの方に階段状に削っていく。
凸状になっているときは、への字型にして、逆に凹状になっている時はV字型にする。
基本処理はこれだけだけど、その判定が難しい。
完全に同じ色が連続している場合以外に、ドットが綺麗に見れるように少し暗い色や明るい色が入っているケースも考えられるが、グラデーション部分などはその少し違う色は別に扱わなくてはいけない。
これは比較的単純に隣接色の色差があるしきい値を超えるかどうかで判断している。
隣接色が近い色の場合は、グラデーションとみなしてすべて違う色として扱い、遠い色の場合は境界部分として近似色も領域がつながっているとして処理している。
色差は、人間の視覚を近似するよう設計されているLab色空間を用いて、色差の距離で判定している。
目で見た時に明るさを除いて、近い色に見えるかどうかが判断基準とも言える。

削るのは常に暗い色の側になるように処理しているため、内部の線などは細く拡大されてしまう傾向がある。
特に眉毛などにその傾向が顕著に出る。
人は周囲とのバランスや描かれているものから判断するが、それをプログラムで行うのは難しい。
この部分は要改善項目としてある。
また、傾斜が検出できない時などが細部でよく発生するため、細部の拡大はうまくいかないことが多い。
まあ、元々細部の情報は失われてしまっているので、それを復元するのは困難と言うのもあるが。
ただ単純に処理を省いているために元のドットが残ってしまっている部分もあるので、その辺りはもう少し作り込む余地がある。

他のアプローチやそれらとの併用も考えたが、現状上述の方法が最もよい結果を残している。
たとえばバイキュービックで拡大して、元の画像の位置の周囲9ピクセルを見て、最も近い色を選んでやる方法や、拡大後にガウスブラーをかけて同様に周囲9ピクセルから選ぶ方法を試したが、どちらもあまりよい結果にはならなかった。
ガウスブラーの場合輪郭はアルファ値をある程度のしきい値で取捨すると、輪郭はなめらかになる。
ただ、鋭利になって欲しいところが丸くなってしまったりもして、困る場合もありそうだった。
画像は全体的にのっぺりしてしまう。
現状の処理で不向きな部分は、これらガウスブラーやバイキュービックの結果から選択的に使用することでよりよい結果を出せるかもしれない。
テレビなどで行われている超解像処理などは、領域によって処理を分けているようなので、似たような処理を行うのが妥当かもしれない。
周囲の画素と元画像で誤差が大きくなってしまっている領域に対しては、別処理を行うなどが妥当かもしれない。
現状でもまずまずの結果が出ているが、もう少し良好な結果が出るように改善したいところである。

作る前に SmillaEnlargerMugenViewer を試してみたが、どちらもドット絵には不向きであった。

ツールの本体はここに置いている。



投稿者 Takenori : 2012年10月11日 03:16




comments powered by Disqus
Total : Today : Yesterday : なかのひと