使用Jupyter和Python自动化图像处理

如果您知道如何使用Python的开源库来进行图形处理,则可能不希望了解图形处理程序中的图像处理。







最近,我的孩子想用他最喜欢的动画片为角色着色。显而易见的解决方案是为Linux使用某种图形编辑器(因为我是Linux用户),但后来我想起自己是个懒人。



幸运的是,我熟悉Python和JupyterLab。让我们看看Jupyter如何使任务变得更容易。



首先,我们当然需要一个现代版本的Python(如果您是macOS用户,则可以按照本教程进行操作)。然后,您需要安装并打开JupyterLabPillow -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。像热蛋糕一样分散!






All Articles