2012年10月11日

ドット絵の拡大

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

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

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

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

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

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

投稿者 Takenori : 03:16 | トラックバック

2012年10月14日

ドット絵拡大説明動画

ドット絵をそれっぽく拡大するツールを作ってみたの再生数がすごい伸びていたので追加で2個動画を作った。
1個はGUIで機能追加したのでその辺りの説明、もう1個はなぜ必要かとアルゴリズムの簡単な説明。

前回のじわじわ変わっていく動画があまりにも地味だったので、どんどん拡大しても荒れないところを最初に持ってきた。
見た目ベクター画像のように見えるけど、ドット絵を拡大している。
最近はベクター画像も結構あるのでなにげに見ていたら見逃しそうだけど、ドット絵ということを考えると驚異かも。

バイリニアやバイキュービックなどの拡大方法とごっちゃになっている人のコメントが散見されるので、解決すべき課題などを説明する動画を作った。
後半はアルゴリズムの説明。

最初に上げた動画はすごく地味で、分野的にもかなりニッチなのに再生数が妙に伸びていて謎な状態。
処理途中の動画を作ったら面白そうと思って作ってみたら、期待に反してすごい地味な動画が出来上がったんだけど、逆にそれが奏功したのかな。

投稿者 Takenori : 13:49 | トラックバック

2012年10月16日

タイリング領域の認識と拡大

ドット絵のタイリング部分を拡大するときは、拡大後も同じようにタイリングできればいくら拡大しても綺麗なままになる。
単純にニアレストネイバーで拡大したものを重ねると以下のようになる。
gradation_near.png

今回作ってみた機能で拡大すると以下のようにタイリング部分のドットが荒くならない。
gradation_scale.png

タイリングで描かれた部分もいくら拡大しても綺麗なままとなると驚異的なんだけど、しきい値となるパラメータが微妙で実使用でうまく処理できるかどうかは微妙なところ。
後、256色になるとあんまりタイリング使われないだろうから、機能として使われるかどうかもわからないのがなんとも。

投稿者 Takenori : 03:52 | トラックバック

2012年10月17日

タイリング拡大処理の実画像の適用はまだ難しい

タイリング拡大をタイリングが多い 16色 CG に適用してみたが、しきい値の絞り込みが難しく、破綻しないようにするとうまく適用されるところが少ないので、現在の処理方法では実用は無理か。
現在の方法は、色の変化が大きくてと標準偏差が小さいところはタイリングされている場所としていたけど、よく考えたら標準偏差を誤認識していた。
タイリング領域の検出は再考が必要。

タイリング部分以外に凹凸状になったところの処理結果を改善した。
以下比較。
左が以前のもので、右が今のもの。
左は曲線にとがったようなところが出てしまっているが、右は幾分改善されなめらかになっている。

old_new_curve.png


自動処理の方を作り込むよりも、効率を考えるとまずは手作業で領域を指定して処理する拡大(高解像度化)支援に注力してツールを作り込んだ方が良さそうか。
オート実行して場所指定でニアレストネイバー戻したり、なぞったところだけオート実行結果を適用したり等、処理と位置選択で高解像度化していくのが現時点では効率的。
理想はフルオートで高解像度化なんだけど、まだまだそこは遠い。

現在のツールはさくっと作ったものだけど、本格的に作るとなると開発費の回収を考えないと。
ニッチであまり使う人いなさそうだけど、シェアウェアとするのがいいかな。
今のJavaの自動処理のはフリーでいいけど。
現在の階段状の部分の検索はよりよい方法を思いついたので、また試してみる。

現在のツールをいろいろなタイプの画像に適用して結果を貼ってくれているところがあったのでリンク貼っておく。
ドット絵をそれっぽく拡大するツールを使ってみた

投稿者 Takenori : 00:47 | トラックバック

2012年10月19日

小数点以下の拡大

小数点以下の拡大は現在のアルゴリズムだと原理的に無理。
角を削る関係上、1ドット未満のドットを中間色を使わずに塗ることは出来ない。
では、全く不可能かというと、3倍に拡大した後、ニアレストネイバーで半分のサイズにすれば、1.5倍が実現できるので、同等の処理をすれば可能。
現在のツールで3倍に拡大した後半分にしても比較的良好な結果になっているようには見える。
ただ、人力でやる場合の結果に近いかどうかは不明。
機能としてあってもいいが、満足できるクオリティーになるかはわからない。

投稿者 Takenori : 15:36 | トラックバック

2012年11月08日

ネイティブ+手動補正版

dotScaleNative.png

Java から C++ に書き換えているけど、エッジ部分の処理が何かおかしい。
どこかミスっている。

このツールは Java から C++ への書き換え以外に、手動でも補正できるようにする。
階段状の部分をドラッグすると斜めに削ってくれたり、ドット状の斜め線を順にクリックしていくと綺麗な線にしたり、指定したピクセルをニアレストネイバーで拡大したものに戻したりと言ったことを出来るようにして、自動処理 + 手動補正で素早く高解像度化できるようにすることを目指している。
自動処理のアルゴリズムも改善していきたいところだけど、すぐには大幅に綺麗に出来そうにはないので、まずは手動補正を取り入れて大きく手間を軽減出来るツールにする。

投稿者 Takenori : 02:04 | トラックバック

2012年11月20日

編集機能の比重を減らした方がいいか

DotScale - ドット絵高解像度化支援ツール
予定している機能を淡々と実装して、毎日新バージョンリリースしているが、今日少し拡大作業してみて方向性がやや違う気がした。
ドット打つ機能を入れたものの、最低限なのでこのツール上でドット編集するのはあまり向いていない。
かと言って、ドット編集機能を強化するべきかというと、違う気がする。
自動処理周りの強化に注力すべき。
高解像度化の前処理ツールとしての機能を重点的に強化して、ドット編集は他のツールでするような形が望ましいと思われる。
ドット打つくらいはあっても良いと思うが。

今日の機能追加で、ペンの太さを追加したので、ニアレストネイバーに戻す部分の選択が楽になった。
ある程度の範囲をニアレストネイバーに戻す場合、今までは1ドットずつだったので面倒だったけど、太さを入れたので、ある程度の範囲戻す場合にやりやすくなった。

投稿者 Takenori : 01:17 | トラックバック

 
Total : Today : Yesterday :