摄影已经有一百多年的历史了。如今存在着许多老照片,您的家人可能也珍藏着一些。受当时相机和胶片技术的限制,您手中的照片可能分辨率低、模糊,或者有折痕和划痕。将这些老照片修复如新,就像用今天的相机拍摄的一样,是一项挑战性的任务,但即使是您,也可以通过 Photoshop 等照片编辑软件来完成。
在这篇文章中,您将看到如何使用 Stable Diffusion 来修复老照片,并为它们注入新的生命。读完这篇文章,您将学会:
- 如何清理扫描照片中的缺陷
- 如何为黑白照片上色
立即开始您的项目,阅读我的书籍《用 Stable Diffusion 精通数字艺术》。书中提供了自学教程和可运行的代码。
让我们开始吧。

Stable Diffusion 项目:修复旧照片
照片来源:Antonio Scant。部分权利保留。
概述
本教程分为三个部分;它们是
- 项目构想
- 超分辨率
- 重建
项目构想
让我们来看一张纽约公共图书馆的老照片。

“年轻的牡蛎去壳工”照片。来自纽约公共图书馆数字馆藏。
如果您下载它,您会注意到这张照片的分辨率很低。它带有轻微的胶片颗粒噪点(不明显)。照片是黑白的。这个项目的目标是将其修复成一张高分辨率的彩色照片,再现照片中的人物。
超分辨率
原始照片分辨率较低。放大分辨率称为超分辨率,为此已经开发了多种机器学习模型。
处理老照片的第一步是进行超分辨率。通常,老照片分辨率较低,但这并非唯一原因。即使分辨率很高(例如,您以高分辨率扫描老照片),您仍然可能想将其降采样并运行超分辨率,因为它还具有去除噪点和胶片颗粒的副作用。
在 Stable Diffusion Web UI 中,您可以将照片上传到“Extra”(额外)选项卡。此选项卡允许您执行许多操作,但没有一项与扩散过程相关。相反,它是将图像应用于各种现有的机器学习模型。在这里,您可以启用“Upscale”(放大),并设置“Scale by”(缩放比例)为一个合理的系数。对于这张特定的照片,您可以将系数设置为 2。然后您应该选择一个放大器,例如“R-ESRGAN 4x+”。
在 Extra 选项卡中您可以做的下一件事是 CodeFormer。它是一个用于修复人脸的模型。启用它并设置权重。较低的权重使 CodeFormer 更自由地改变人脸,而较高的权重则倾向于保留原始面部表情。最佳权重应取决于原始照片的质量。如果人脸上有更多划痕或污迹,您需要较低的权重以方便重建。

超分辨率是处理老照片的第一步。
您应该下载放大后的输出以供下一步使用。
重建
要重建老照片,您将使用 txt2img。您不应使用 img2img,因为将老照片作为起点会对其输出产生过大的影响,而您将看不到预期的校正。
但首先,您应该使用 img2img 选项卡,上传放大后的输出,然后点击“CLIP interrogator”的回形针图标。这将根据上传的图像自动填充正面提示。您将在 txt2img 选项卡中根据 CLIP interrogator 的结果构建您的提示。

您可以使用 img2img 选项卡中的 CLIP interrogator
现在转到 txt2img 选项卡。让我们使用 SD1.5 模型进行照片级写实生成,例如 Realistic Vision v6。设置正面提示,例如:
一群孩子们站在一起,手里拿着水桶,戴着帽子,穿着连衣裙,背景是建筑,August Sander,彩色照片,wpa,美国巴比松画派,最佳质量,8k 原生照片,细节丰富的人脸
最后几个关键词用于控制输出的风格。您可以使用一个样板负面提示,例如:
绘画,油画,蜡笔画,素描,石墨画,印象派,噪点,模糊,柔和,变形,丑陋,低分辨率,糟糕的解剖结构,糟糕的手,裁剪,最差质量,低质量,普通质量,jpeg 伪影,签名,水印,单色,灰度,老照片
老照片重建的关键是使用 ControlNet。为了获得最佳效果,您需要两个 ControlNet 单元。
首先将放大后的图像上传到第一个 ControlNet 单元,并将类型设置为 Canny。请记住启用此单元并勾选“Pixel Perfect”。这有助于 ControlNet 预处理器使用最佳分辨率。将第一个单元的控制权重设置为 0.8。
然后启用第二个 ControlNet 单元。上传相同的图像,打开 Pixel Perfect,然后选择“Recolor”(重新着色)作为控制类型。这是一个为黑白照片上色的 ControlNet 模型。您应该使用“recolor_luminance”模型作为预处理器。将第二个单元的控制权重设置为 0.2。您可以选择性地调整伽马校正,以微调输出的亮度。
请记住在 txt2img 中将输出尺寸设置为与原始图像相似的宽高比,并接近 Stable Diffusion 模型的原生分辨率。在此示例中,我们使用 760×600 像素。点击生成,您将看到以下图像:

使用 Stable Diffusion 上色的老照片
您可以下载结果。让我们看看您得到了什么:

修复后的老照片。
这张照片有点过曝,但您可以看到一张老照片被复活了。所有细节都得以保留:所有人物的面部表情、衣服上的污迹等。
但这如何实现呢?这实际上是让 Stable Diffusion 重新绘制照片。因此,您需要一个提示来指导绘制的扩散过程。但是,为了精确控制形状和人物,您使用了 Canny 类型 ControlNet 来勾勒轮廓,并要求扩散过程适应轮廓。但是,这个轮廓并不完美,因为 Canny 边缘检测算法无法将图片转换为线描画。为了降低失真,您使用第二个 ControlNet 单元根据亮度重新为输入照片着色。所有原始颜色都被忽略(实际上也没有颜色),颜色是根据机器学习模型填充的。然而,您不希望照片中出现这些缺陷。因此,您为 Canny 设置了较高的权重,而为 Recolor 设置了较低的权重。
如果您再次单击生成按钮,您可能会看到人物穿着不同颜色衣服的照片。这是因为模型对其应穿着的颜色没有把握。您可能希望在提示中描述颜色以进行控制。您也可以尝试关闭其中一个 ControlNet 单元并观察结果。最佳结果只能在两者协同工作时获得。
关于人脸照片的注意事项:如果您的原始照片状况不佳,人物的面部特征不太清晰,您需要打开 ADetailer 来重建面部。但仅在必要时这样做!否则,您可能会发现照片描绘的是完全不同的人。
在上面,输出分辨率设置为 760×600 像素。但您可能需要比 Stable Diffusion 模型支持的更高分辨率。您可以使用 txt2img 中的“Hires. fix”(高分辨率修复)功能,在图像生成后运行一个放大器。选项与 Extra 选项卡中的非常相似。但请记住,在放大器中将去噪强度设置为较低值(例如 0.2),因为您不希望引入额外的失真。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
- 纽约公共图书馆数字馆藏中的 Lewis Wickes Hine 纪实摄影作品,1905-1938
- Civitai 和 Hugging Face Hub 上的 Realistic Vision 模型
- OpenModelDB 用于放大模型
- ControlNet 重新着色模型
- ControlNet Canny 模型
总结
在这篇文章中,您清理了一张老照片。您去除了缺陷,并为黑白照片上了色,使其焕发新生。在此过程中,您使用了文本提示来驱动扩散过程以粗略级别生成图像。然后,您使用 ControlNet 对输出进行微调。您在粗略级别控制了氛围,并在精细级别保留了细节。Stable Diffusion 负责填补空白并重建照片。
暂无评论。