paint-brush
如何给黑白照片上色经过@alexk0
615 讀數
615 讀數

如何给黑白照片上色

经过 Aleksandr Korepanov4m2024/06/07
Read on Terminal Reader

太長; 讀書

DeOldify 是一款只需点击几下鼠标就能为老照片上色的工具。它是免费的开源软件,你只需要写一点 Python 代码就可以了。
featured image - 如何给黑白照片上色
Aleksandr Korepanov HackerNoon profile picture
0-item

我们每个人都有父母、祖父母等传下来的大量旧照片。这些照片通常都是黑白的,有时我们希望将它们变成彩色。网上有许多网站,您只需在浏览器中单击几下即可实现此目的。然而,这些网站的问题在于它们在数量和质量上有很多限制。


此外,这些服务通常需要注册和订阅,这可能令人非常沮丧。


在这篇文章中,我想分享如何使用奇妙的工具DeOldify为任意数量的照片上色,而不受限制、注册或订阅的麻烦。


DeOldify有一个很棒的介绍,你可以使用它,但对于没有准备的人来说,它可能看起来有点难。这里,我想演示一种更简单的使用DeOldify的方法。

准备环境

首先,你需要一台运行LinuxmacOS 的计算机。如果你使用的是Windows ,你仍然可以通过使用Windows Subsystem for Linux (WSL)来继续。


以下是Ubuntu所需软件包的列表:

 sudo apt update sudo apt install python3-pip wget git ffmpeg libsm6 libxext6


如果您有其他Linux发行版,您可以使用该列表作为参考。


对于macOS (不幸的是,这是一个近似列表,因为我没有明确的macOS可供测试):

 brew install python wget git ffmpeg libsm libxext


下一步是创建一个名为Sandbox 的单独文件夹来执行所有操作。您可以选择任何其他名称,甚至可以选择不创建任何内容并完全跳过此步骤。

 # Optional mkdir Sandbox cd Sandbox


然后克隆DeOldify

 git clone https://github.com/jantic/DeOldify.git


DeOldify没有任何版本或标签,这意味着我们使用分支。我相信所有内容都应该随时与最新的主分支兼容。但以防万一,这里是我用来测试所有内容的修订号:


be725ca6c5f411c47550df951546537d7202c9bc 。如果你愿意,你可以看看:

 # Optional cd DeOldify git checkout be725ca6c5f411c47550df951546537d7202c9bc cd ..


之后,安装所有 Python 依赖项:

 pip3 install --user -r DeOldify/requirements.txt pip3 install --user -r DeOldify/requirements-colab.txt pip3 install --user -r DeOldify/requirements-dev.txt


接下来,为模型创建一个目录,并下载模型:

 mkdir -p DeOldify/models wget https://data.deepai.org/deoldify/ColorizeArtistic_gen.pth -O DeOldify/models/ColorizeArtistic_gen.pth


就这样!环境已经准备好了;最困难的部分已经过去了。现在,让我们写一些 Python 代码。

给一切涂上颜色

对我们来说最有趣和最有用的函数是ModelImageVisualizer.plot_transformed_image()


我们需要做的就是围绕它编写代码。


这是我的实现:

 #!/usr/bin/python3 from deoldify import device from deoldify.device_id import DeviceId # choices: CPU, GPU0...GPU7 device.set(device=DeviceId.GPU0) from deoldify.visualize import * import warnings import sys import os warnings.filterwarnings("ignore", category=UserWarning, message=".*?Your .*? set is empty.*?") # Play with this constant! render_factor = 35 input_dir = sys.argv[1] output_dir = sys.argv[2] if not os.path.isdir(input_dir): print("input directory is not a directory or not exist") sys.exit(1) if os.path.exists(output_dir): print("out directory is already exist") sys.exit(1) os.makedirs(output_dir) root_dir = Path(os.environ['PYTHONPATH']) colorizer = get_image_colorizer(root_folder=root_dir, artistic=True) for filename in os.listdir(input_dir): f = os.path.join(input_dir, filename) if os.path.isfile(f) and (f.endswith(".png") or f.endswith(".jpg") or f.endswith(".jpeg")): image_path = colorizer.plot_transformed_image( path=f, results_dir=Path(output_dir), render_factor=render_factor, compare=True, watermarked=False ) print("{} ready".format(image_path))


请随意复制、粘贴并修改它。


该脚本从作为第一个脚本参数传递的目录中读取所有.png.jpg.jpeg图像并对其进行着色,将结果保存到作为第二个脚本参数传递的目录中。请注意,输出目录一定不存在;脚本会自行创建。我将脚本保存在Sandbox/runner.py文件中,但如果您愿意,可以使用其他位置和名称。


我们来尝试一下吧!我将一张黑白照片放入Sandbox/photos/in ,输出目录为Sandbox/photos/out

 # from Sandbox directory PYTHONPATH=./DeOldify/ python3 runner.py photos/in/ photos/out/


环境变量PYTHONPATH必须引用DeOldify目录。


结果如下:

黑白照片

彩色照片

原始照片