纹理合成算法与应用 - 从基于块的方法到深度学习

· 9 分钟阅读

什么是纹理合成 - 核心概念与应用

纹理合成从小样本纹理生成任意大小的新纹理,保持与样本相同的视觉特征和统计属性。生成的纹理应看起来像样本的自然延续,而非简单的平铺重复。

应用场景:

  • 游戏和 CG:为 3D 模型生成无缝纹理贴图
  • 图像编辑:扩展图像边界 (outpainting)
  • 图像修复:用周围纹理填充缺失区域
  • 材质设计:从照片生成可平铺的材质纹理

纹理分类:

  • 随机纹理:沙子、噪声、云彩。统计方法效果好
  • 规则纹理:砖墙、瓷砖、编织物。需要保持结构规律
  • 半规则纹理:树皮、石头、布料。介于两者之间

定义与应用领域:纹理合成 (Texture Synthesis) 是指从一张较小的样本图像自动生成视觉上等价的大尺寸纹理的技术,在游戏开发、电影 VFX、建筑可视化、3D 建模等广泛领域中得到应用。

质量的评价:除了 SSIM 和 FID (Frechet Inception Distance) 等定量指标之外,主观评价也被认为是不可缺少的。

基于像素的方法 - Efros-Leung 算法

Efros-Leung (1999) 是纹理合成的开创性工作,逐像素生成新纹理。

算法原理:

  • 从种子像素开始,逐步向外扩展
  • 对于每个待填充像素,在样本纹理中搜索具有最相似邻域的像素
  • 将找到的最佳匹配像素的值赋给当前位置
  • 邻域大小 (窗口) 控制合成质量和速度的权衡

优点:概念简单;可处理各种纹理类型;结果自然无重复感。

缺点:极其缓慢 (每像素需要全局搜索);大窗口时搜索空间爆炸;可能出现"生长"方向的偏差。

加速方法: Wei-Levoy 使用树形搜索加速;Ashikhmin 利用相邻像素的匹配结果缩小搜索范围。但基于像素的方法整体已被基于块的方法取代。

算法的由来与步骤:基于像素的纹理合成,以 1999 年 Efros 与 Leung 提出的方法为基础。步骤是:取出输出图像中尚未生成像素的周围邻域 (例如 11x11 的邻域窗口);在输入纹理内滑动同尺寸的窗口,检索 SSD (Sum of Squared Differences) 最小的块;把最相似块的中心像素值写入输出;按光栅扫描顺序或洋葱剥皮顺序处理全部像素。

邻域窗口尺寸的影响:窗口尺寸小 (5x5 左右) 时只能捕获局部特征,整体结构会崩坏;大 (23x23 以上) 时结构能够保持,但计算成本以 O(N²) 增长,并且会接近对输入纹理的简单复制。实用上推荐 9x9 到 15x15。

计算成本的问题:生成 256 × 256 的输出时,需要对 65,536 个像素分别扫描整张输入纹理;对 128 × 128 的输入来说,约需 10 亿次比较运算。虽然有基于 ANN (Approximate Nearest Neighbor) 和 Tree-Structured Vector Quantization 的加速方案,但仍不适合实时处理,生成 256 × 256 需要数分钟到数十分钟。

基于块的方法 - Image Quilting 和 GraphCut

基于块 (Patch) 的方法一次合成一个图像块而非单个像素,大幅提升速度和质量。

Image Quilting (2001, Efros & Freeman):

  • 从样本中随机选取块,按网格排列
  • 相邻块的重叠区域通过最小误差边界切割 (Minimum Error Boundary Cut) 拼接
  • 动态规划找到重叠区域中误差最小的切割路径
  • 速度比像素方法快 100-1000 倍

GraphCut Textures (2003):

  • 使用图割算法找到最优拼接边界
  • 可处理不规则形状的拼接区域
  • 质量优于 Image Quilting 的简单路径切割

参数选择:

  • 块大小:应大于纹理的最大重复单元
  • 重叠宽度:通常为块大小的 1/6 到 1/3
  • 块太小:丢失大尺度结构;块太大:可能出现明显重复

两个代表性方法:2001 年的 Image Quilting (Efros-Freeman) 与 2003 年的 GraphCut Textures 是代表。Image Quilting 的流程是:把输出图像划分为带重叠区域的网格 (例如块尺寸 36x36、重叠 6 像素);在各网格位置,从输入中检索与已放置块的重叠区域 SSD 低于阈值的块;用动态规划在重叠区域求最小代价的边界线 (Minimum Error Boundary Cut);沿边界线裁剪拼接,使接缝最小化。

GraphCut 的改良与参数设定:GraphCut Textures 把块之间的最佳边界表述为图割 (最大流/最小割) 问题。它求的不是 Image Quilting 那样的 1 维边界线,而是 2 维意义上的最佳边界,因此能得到更自然的合成结果。参数方面,块尺寸以纹理特征尺度的 1.5-2 倍为参考:砖墙取包含 1 块砖的尺寸,木纹则设为木纹重复周期的 2 倍左右。

统计方法 - Gram 矩阵与神经风格迁移

基于 CNN 特征统计的纹理合成方法,利用 Gram 矩阵捕获纹理的统计特征。

Gram 矩阵纹理模型 (Gatys et al., 2015):

  • 将纹理定义为 CNN 特征图的 Gram 矩阵 (通道间相关性)
  • 从随机噪声开始,优化图像使其 Gram 矩阵匹配目标纹理
  • 多层 Gram 矩阵捕获从细到粗的多尺度纹理特征

优势:

  • 可生成任意大小的纹理
  • 自然处理多尺度结构
  • 与风格迁移共享相同的理论框架

局限性:

  • 优化过程慢 (数分钟)
  • 对规则纹理 (砖墙等) 效果差 (Gram 矩阵丢失空间结构)
  • 可能产生不自然的伪影

前馈方法:训练生成网络直接输出纹理,推理时单次前向传播即可。速度提升 1000 倍以上。

用 Gram 矩阵表示纹理:把 VGG-19 网络各卷积层的特征图 (尺寸 C×H×W) 变形为 C×(H*W) 的矩阵,再计算该矩阵的内积,即 C×C 的 Gram 矩阵。

合成的步骤:从随机噪声图像开始;计算输入纹理与生成图像各层 Gram 矩阵之差 (风格损失);用 L-BFGS 或 Adam 优化器反复更新生成图像的像素值;通常 300-500 次迭代即收敛。

优点与界限:该方法对随机性纹理 (云、水面、砾石) 能产生出色的结果,但对结构性纹理 (砖、格栅) 有无法保持长距离空间规律性的缺点。计算成本也高,用 GPU 生成 512 × 512 约需 30 秒。作为改良,有用前馈网络直接生成纹理的方法 (Ulyanov et al., 2016),把推理时间缩短到数毫秒。

GAN 纹理合成 - 高质量高速度

GAN (生成对抗网络) 可以学习纹理的分布并快速生成高质量的新纹理样本。

PSGAN (Periodic Spatial GAN):专门设计用于生成具有周期性结构的纹理。在潜在空间中编码周期性信息。

SinGAN (2019):

  • 从单张图像学习生成模型
  • 多尺度 GAN 金字塔,从粗到细逐步生成
  • 可用于纹理合成、超分辨率、图像编辑等多种任务
  • 训练时间:单张图像约 10-30 分钟

StyleGAN 纹理: StyleGAN 的风格注入机制天然适合纹理生成。通过控制不同层的风格向量,可以独立控制纹理的粗细特征。

扩散模型:最新的扩散模型 (如 Stable Diffusion) 可以通过文本提示生成任意纹理。"seamless tileable wood texture, 4k" 即可生成高质量木纹纹理。

GAN 方法的定位:使用 GAN (Generative Adversarial Network) 的纹理合成,是能以接近实时的速度生成高质量结果的最新思路。训练只需单张图像即可,但每张图像的训练时间约 30 分钟 (GPU)。基于 StyleGAN 的方法则利用 StyleGAN2 的架构,从潜在空间生成纹理。

实用比较与产业应用:质量为 GAN 基 > Gram 矩阵 > 基于块 > 基于像素 (结构性纹理的情况);推理速度为 GAN 基 (10ms) > 基于块 (1s) > Gram 矩阵 (30s) > 基于像素 (数分钟);可控性方面 GAN 基可通过潜在空间操作获得高可控性;训练成本方面 GAN 的预训练需要数小时到数天。产业应用上,游戏引擎 (Unreal Engine 5、Unity) 已开始内置实时纹理合成,与 Nanite 结合的动态纹理生成受到关注。

实用纹理合成 - 工具与工作流

在实际项目中应用纹理合成的工具和最佳实践。

无缝平铺纹理制作:

  • Photoshop 偏移法:滤镜 → 其他 → 位移,将接缝移到中心后修复
  • GIMP 无缝化:滤镜 → 映射 → 无缝化
  • Materialize:开源工具,从照片生成 PBR 材质 (法线图、高度图等)

程序化纹理:

  • Substance Designer:节点式程序化纹理生成,游戏行业标准
  • Perlin/Simplex 噪声:程序化生成自然纹理的基础算法
  • Shader 纹理: GLSL/HLSL 中实时生成纹理,零内存占用

AI 纹理生成:

  • Stable Diffusion + ControlNet:从草图或参考生成纹理
  • Poly.cam 材质生成:从照片自动生成可平铺 PBR 材质
  • 提示词技巧:加入 "seamless", "tileable", "4k texture" 提高质量

开源库:OpenCV——用 cv2.inpaint() 可以做基于纹理的修复,实现了 Telea 法与 Navier-Stokes 法;scikit-image——用 skimage.restoration 模块可以使用基于块的合成;PyTorch——可用 torchvision.models.vgg19 实现基于 Gram 矩阵的合成,配合 GPU 加速生成 512 × 512 约需 30 秒;Substance Designer——程序化纹理生成的业界标准工具,节点式工作流支持非破坏性编辑。

无缝纹理的制作步骤:把输入图像的边缘重叠后做混合 (交叉淡化法);用 Image Quilting 设定无缝的边界条件再合成;通过频域上的相位调整确保周期性的连续。

质量检查的要点:把合成结果按 2x2 或 3x3 平铺来确认接缝。对结构性纹理,重要的是比较 FFT 的功率谱,确认周期性是否得到保持。FID 分数在 50 以下即可判断为高质量。另外,先以 256 × 256 做粗略合成,再分阶段上采样并追加细节;与直接生成 4K 相比,这种做法可以提速 5-10 倍。

相关文章

神经风格迁移工作原理 - 艺术风格转换的原理与实现

详解神经风格迁移的原理,从内容损失和风格损失的数学定义到快速风格迁移和 AdaIN,涵盖 PyTorch 实现指南。

GAN 图像生成的应用 - 从超分辨率到风格迁移

系统讲解 GAN 在图像处理中的实际应用。涵盖超分辨率、风格迁移、图像修复、人脸生成和实用部署方案。

游戏开发中的图像格式选择 - 纹理压缩与渲染性能

游戏开发中图像格式选择指南。涵盖 GPU 纹理压缩机制、BCn 系列、ASTC、容器格式以及纹理图集与流式加载架构设计。

图层合成基础 - 混合模式完全指南与实用技巧

系统讲解图层合成和混合模式。涵盖正片叠底、滤色、叠加等模式的数学原理、视觉效果和实际应用技巧。

WebGL 实时图像特效 - 从 Shader 基础到生产应用

使用 WebGL 实现实时图像特效的完整指南。涵盖 GPU 并行处理基础、色彩校正、模糊效果、扭曲特效及性能优化。

图像修复技术与应用 - 从经典方法到深度学习

系统讲解图像修复(Inpainting)技术。涵盖经典扩散方法、基于块的方法、深度学习方法和实际应用场景。

相关术语