最近,我的孩子想用他最喜欢的动画片为角色着色。显而易见的解决方案是为Linux使用某种图形编辑器(因为我是Linux用户),但后来我想起自己是个懒人。
幸运的是,我熟悉Python和JupyterLab。让我们看看Jupyter如何使任务变得更容易。
首先,我们当然需要一个现代版本的Python(如果您是macOS用户,则可以按照本教程进行操作)。然后,您需要安装并打开JupyterLab和Pillow -Python Imaging Library(PIL)的一个分支:
$ python -V
Python 3.8.5
$ pip install jupyterlab pillow
……………………..
$ jupyter lab
在这种情况下,我们要用鹿的形象绘画。首先,让我们下载图像并将其保存在本地。最好使用创用CC或其他开源许可证中的图像,以免打扰版权。在此示例中,我使用了Unsplash的开源图像并将其命名为deer.jpg。
让我们从导入开始:
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]
现在,线条已经清晰了,但是调色板本身还不适合打印,因为打印机的墨水将用完,并且您的孩子将不喜欢在黑色背景上绘制图片。因此,我们将颜色反转。将x的阈值设置为max-black和max-white,以使线条更加清晰:
outline = bands[0].point(lambda x: 255 if x<100 else 0)
outline
现在让我们注意图片中有很多空白,因此我们将其裁剪:
outline.crop((10, 200, 300, 400))
好,仅此而已。让我们将图片保存为PDF格式(用于打印):
outline.save("deer.pdf")
这样您就可以轻松为孩子制作自己的彩页:最少的例行程序,最大的编程量!
广告
Epic服务器是具有强大的AMD EPYC处理器和非常快速的Intel NVMe驱动器的Linux或Windows VPS。像热蛋糕一样分散!