最近,我的孩子想用他最喜欢的卡通片制作一张着色页。我的第一个想法是使用 Linux 上某个开源图像处理程序,但后来我记起我根本不知道如何使用它们。幸运的是,我知道如何使用 Jupyter 和 Python。
我心想,用 Jupyter 来做这件事能有多难呢?
要跟着本文操作,您需要安装现代版本的 Python(如果您是 macOS 用户,可以参考这份指南),然后安装并打开 Jupyter Labs,您可以在这里了解更多信息,以及 Pillow,它是 Python Imaging Library (PIL) 的友好分支,使用以下命令安装:
$ python -V
Python 3.8.5
$ pip install jupyterlab pillow
# Installation process ommitted
$ jupyter lab
假设您想用一张鹿的图片制作着色页。第一步可能是下载一张鹿的图片并将其保存在本地。请注意版权状态可疑的图片;最好使用带有 知识共享 或其他开放访问许可的图片。在本例中,我使用了来自 Unsplash 的一张开放许可图片,并将其命名为 deer.jpg
。
进入 Jupyter Lab 后,首先导入 PIL
from PIL import Image
完成这些准备工作后,打开图像,然后查看图像大小
pic = Image.open("deer.jpg")
pic.size
(3561, 5342)
哇,这有点令人震惊——高分辨率图片如果您想制作一本关于鹿的精美书籍当然很好,但对于自制着色书页来说可能太大了。将其缩小很多。(这种善意也很重要,这样本文在您的浏览器中也能快速加载!)
x, y = pic.size
x //= 10
y //= 10
smaller = pic.resize((x, y))
这会将图像的比例缩小了 10 倍。看看效果如何
smaller

(Moshe Zadka, CC BY-SA 4.0)
漂亮!这只雄伟而孤高的鹿对于边缘检测算法来说应该易如反掌。说到这里,是的,下一步就是边缘检测。您需要清理图像,以便轻松着色,谢天谢地,有一个算法可以做到这一点。进行一些边缘检测
from PIL import ImageFilter
edges = smaller.filter(ImageFilter.FIND_EDGES)
edges

(Moshe Zadka, CC BY-SA 4.0)
这可能是最重要的一步。它去除了所有无关的细节,留下清晰的线条。颜色有点奇怪,但这不难解决。将图像分成颜色带,然后选择线条最清晰的那一个
bands = edges.split()
bands[0]

(Moshe Zadka, CC BY-SA 4.0)
现在线条清晰了,但这并不是一张好的打印图像,因为您的打印机很快就会用完墨水,而且您的孩子也不会喜欢在黑色上着色。因此,反转颜色。同时,通过使用 lambda 函数调用,将颜色捕捉到最大黑色或最大白色,使线条更加清晰
outline = bands[0].point(lambda x: 255 if x<100 else 0)
outline

(Moshe Zadka, CC BY-SA 4.0)
原始图像有很多自然景观,我无情地清除了它们。现在有很多空白空间,因此将图片裁剪到必要的范围
outline.crop((10, 200, 300, 400))

(Moshe Zadka, CC BY-SA 4.0)
剩下要做的就是将图片另存为易于打印的格式,例如 PDF
outline.save("deer.pdf")
我让您自己弄清楚如何从 Linux 打印。
祝您为孩子们制作自制着色书玩得开心!
评论已关闭。