如何将杂乱的神经网络图像转换为完美的像素画
任何尝试通过Midjourney、Stable Diffusion或ChatGPT生成像素画的人几乎都会立即遇到同样的问题。神经网络确实在画小方块,但这些方块歪歪扭扭的。这里的像素是11个屏幕点宽,那里的像素是13个屏幕点宽,对角线变得模糊,网格毫无顾忌地断裂了。简单地通过最近邻或双线性缩小这样的图像是行不通的——图片会立刻变成一团伪影。
perfectPixel库的作者用纯经典的计算机视觉工具解决了这个数学问题,没有使用繁重的扩散模型辅助。
为什么标准缩放不起作用
当我们看生成的精灵图时,似乎有一个清晰的网格。实际上,扩散模型对离散像素坐标一无所知。它们绘制的是连续图像,只是视觉上类似于复古风格。
结果,我们同时遇到了几个问题:
- 整个图像区域的单元格大小不一致。
- 像素比例在水平或垂直方向略有拉伸。
- 边缘被抗锯齿模糊,无法精确确定一个色块在哪里结束、另一个在哪里开始。
- 原始网格分辨率不清楚——是32×32还是48×48。
perfectPixel库接收这样的伪像素图像(作者建议生成512到1024像素之间的源图像),并自动将其转换为严格、均匀的像素矩阵。
管道在底层是如何工作的
该项目没有在神经网络之上再训练另一个神经网络,而是使用经典的信号处理方法,将问题分解为三个清晰的步骤。
首先,算法对源图像应用快速傅里叶变换(FFT)。由于像素以一定的周期性重复,在频谱中会出现明显的峰值。利用这些峰值,库可以计算出基本网格步长,即使你不知道精灵图中色块的确切数量。
接下来,Sobel算子用于检测物理对象的边界。在第一步中找到的网格会稍微偏移,并对齐到实际颜色过渡边缘,以补偿神经网络的光学失真。
安装选项和运行
该项目使用Python编写,提供两种后端供选择。如果速度重要,安装OpenCV变体。如果你需要轻量级的东西而不需要繁重的C库,可以使用纯NumPy实现。
通过pip安装看起来很标准:
# Быстрая версия с OpenCV
pip install perfect-pixel[opencv]
# Легковесная версия только на NumPy
pip install perfect-pixel
在代码中,整个处理只需要三行:
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中构建生成管道的用户,作者创建了一个自定义节点。这允许在扩散图的末尾直接集成网格量化,产生干净的素材,无需在图形编辑器中进行手动后期处理。
你可以在安装之前直接在浏览器中尝试该算法,访问网页演示页面。
谁会发现这很有用
该项目解决了尝试在2D游戏中使用生成式艺术的独立开发者和艺术家的一个痛点。它不会从头重绘精灵图——而是仔细修复扩散的数学缺陷,节省在Aseprite中手动编辑的时间。
如果你生成纹理、物品图标或角色精灵,并且厌倦了清理模糊的边缘,perfectPixel绝对值得在你的本地构建管道中占有一席之地。
相关项目