ニューラルネットワークのぐちゃぐちゃなグラフィックを完璧なピクセルアートに変換する方法
Midjourney、Stable Diffusion、ChatGPTでピクセルアートを生成しようとした人は、ほぼ誰でも同じ問題に直面します。ニューラルネットワークは正直に小さな四角形を描いているのですが、その四角形がぐちゃぐちゃです。ある場所ではピクセルは11個のスクリーンドット幅で、別の場所では13個、対角線がぼやけて、グリッドがいたるところで崩れています。こんな画像をNearest NeighborやBilinearで単純に縮小してもうまくいきません—一瞬でアーティファクトだらけの絵になってしまいます。
perfectPixelライブラリの作者は、重い拡散モデルを使わずに、純粋に古典的なコンピュータビジョンツールでこの数学的問題を解決しました。
なぜ標準的なリサイズはうまくいかないのか
生成されたスプライトを見ると、明らかなグリッドがあるように見えます。しかし実際には、拡散モデルは離散的なピクセル座標について何も知りません。レトロスタイルに視覚的に似ている連続的な画像を描いているだけです。
結果として、同時にいくつかのが発生します:
- セルサイズが画像全体を通して変化する。
- ピクセルの比率が水平または垂直方向にわずかに引き伸ばされている。
- アンチエイリアスによってエッジがぼやけ、1つのブロックがどこで終わり次のブロックがどこから始まるかを正確に判断できない。
- 元のグリッド解決度が不明—32×32だったのか48×48だったのか。
perfectPixelライブラリは、このような疑似ピクセル画像(著者は512〜1024ピクセルのソース画像を生成することを推奨)を受け取り、厳密で均一なピクセルマトリクスに自動変換します。
パイプラインの裏側の仕組み
ニューラルネットワークの上に別のニューラルネットワークを訓練するのではなく、このプロジェクトは古典的な信号処理を使用し、問題を明確に3つのステップに分解します。
まず、アルゴリズムはソース画像に高速フーリエ変換(FFT)を適用します。ピクセルが一定の周期で繰り返されるため、周波数スペクトルに明確なピークが現れます。このピークを使用して、スプライトのブロック数がわからなくても、fundamentalなグリッドステップを計算できます。
次に、物理的なオブジェクトの境界を検出するためにSobelオペレータが活躍します。最初のステップで見つけたグリッドは、ニューラルネットワークの光学的な歪みを補正するために、実際の色遷移エッジにわずかにシフトして整列されます。
最終段階で、各セル内の色サンプリングが行われます。中央のピクセル色、メジアン、または最も頻繁に出現する色(多数決)を選択して、寄生的な色ノイズを排除できます。
インストールオプションと実行方法
このプロジェクトはPythonで書かれており、2つのバックエンドから選べます。速度が重要ならOpenCV版をインストールしてください。重いCライブラリなしで軽量なものが欲しいなら、純粋なNumPy実装が利用可能です。
pipでのインストールは標準的です:
# Быстрая версия с OpenCV
pip install perfect-pixel[opencv]
# Легковесная версия только на NumPy
pip install perfect-pixel
コードでは、処理全体は文字通り3行です:
import cv2
from perfect_pixel import get_perfect_pixel
# Читаем исходный сгенерированный арт
bgr = cv2.imread("images/avatar.png", cv2.IMREAD_COLOR)
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
# На выходе получаем ширину, высоту и готовую чистую матрицу
w, h, out = get_perfect_pixel(rgb)
リポジトリからの視覚的な例です。左はChatGPTのプロンプトからの生成結果、右はライブラリを通した処理結果です。
![]()
グリッドが適切な位置に入り、端数のピクセルが消え、画像をゲームエンジン用の1x PNGやサーモモザイクパターンとしてエクスポートできるようになりました。
微調整と統合
自動化が周波数を間違えた場合や、アートに細かすぎるディテールがある場合は、引数で関数を調整できます:
w, h, out = get_perfect_pixel(
rgb,
sample_method="majority", # Способ выборки цвета: center, median или majority
grid_size=(32, 32), # Принудительный размер сетки, если автодетект не нужен
refine_intensity=0.2, # Диапазон сдвига линий сетки к краям Собеля
fix_square=True, # Принудительно делать пиксели квадратными
debug=False # Показ графиков работы алгоритма
)
ComfyUIで生成パイプラインを構築している人のために、著者はカスタムノードを作成しました。これにより、拡散グラフの最後でグリッド量子化を統合でき、グラフィックエディタでの手動の後処理なしでクリーンなアセットを生成できます。
インストールする前にブラウザで直接アルゴリズムを試すには、Webデモページにアクセスしてください。
誰が役立つのか
このプロジェクトは、2Dゲームで生成的アートを使おうとしているインディーデベロッパーとアーティスト特有の悩みを解決します。スプライトを一から描き直すのではなく、拡散の数学的欠陥を丁寧に修正し、Asepriteでの手動編集の何時間もを節約します。
テクスチャ、インventoryアイコン、キャラクタースプライトを生成していて、ぼやけたエッジのクリーンアップに疲れているなら、perfectPixelは確かにローカルビルドパイプラインに入れる価値があります。
関連プロジェクト