使用 Jupyter 和 Python 编辑图像

当您可以使用已经掌握的开源工具完成工作时,谁还需要学习图像编辑应用程序呢?
78 位读者喜欢这篇文章。
Polaroids and palm trees

最近,我的孩子想用他最喜欢的卡通片制作一张着色页。我的第一个想法是使用 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

漂亮!这只雄伟而孤高的鹿对于边缘检测算法来说应该易如反掌。说到这里,是的,下一步就是边缘检测。您需要清理图像,以便轻松着色,谢天谢地,有一个算法可以做到这一点。进行一些边缘检测

from PIL import ImageFilter

edges = smaller.filter(ImageFilter.FIND_EDGES)
edges

这可能是最重要的一步。它去除了所有无关的细节,留下清晰的线条。颜色有点奇怪,但这不难解决。将图像分成颜色带,然后选择线条最清晰的那一个

bands = edges.split()
bands[0]

现在线条清晰了,但这并不是一张好的打印图像,因为您的打印机很快就会用完墨水,而且您的孩子也不会喜欢在黑色上着色。因此,反转颜色。同时,通过使用 lambda 函数调用,将颜色捕捉到最大黑色或最大白色,使线条更加清晰

outline = bands[0].point(lambda x: 255 if x<100 else 0)
outline

原始图像有很多自然景观,我无情地清除了它们。现在有很多空白空间,因此将图片裁剪到必要的范围

outline.crop((10, 200, 300, 400))

剩下要做的就是将图片另存为易于打印的格式,例如 PDF

outline.save("deer.pdf")

我让您自己弄清楚如何从 Linux 打印

祝您为孩子们制作自制着色书玩得开心!

接下来阅读什么

Jupyter Notebooks 入门

使用 Jupyter 创建具有实时代码、公式、可视化效果和文本的交互式、可共享的笔记本。

标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,在 Linux “安装派对”中提供帮助。他从 1999 年开始编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在这些术语出现之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可再现性以及其他此类事情。

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.