Вряд ли вам захочется разбираться с обработкой изображений в графических редакторах, если вы знаете, как сделать это с помощью открытых библиотек для Python.
![](https://habrastorage.org/webt/ln/w6/2o/lnw62ocrtw13sed7cnk3eteg02q.jpeg)
Недавно мой ребёнок захотел сделать раскраску для персонажа из любимого мультфильма. Очевидным решением было использовать какой-нибудь графический редактор для Linux (потому что я линуксоид), но потом я вспомнил, что я ленивый человек.
К счастью, я знаком с Python и JupyterLab. Посмотрим, насколько Jupyter облегчит задачу.
В первую очередь, нам, конечно, понадобится современная версия Python (если вы пользователь macOS, вы можете следовать этому руководству). Затем нужно установить и открыть JupyterLab и Pillow — форк библиотеки Python Imaging Library (PIL):
В данном случае мы хотим сделать раскраску с изображением оленя. Для начала загрузим изображение и сохраним его локально. Лучше всего использовать картинки с Creative Commons или другой открытой лицензией, чтобы не заморачиваться с авторскими правами. В этом примере я использовал изображение с открытой лицензией от Unsplash и назвал его deer.jpg.
Начнём с импорта:
Откроем изображение и проверим его размер:
Это, пожалуй, многовато для нашей задачи. Такие изображения с высоким разрешением хорошо использовать в книгах, а не в раскрасках. Уменьшим размер изображения:
Размер стал в 10 раз меньше.
![](https://habrastorage.org/webt/xp/mq/e8/xpmqe8rd1nrrfkdy5kemhtvfff4.png)
Прекрасно. Двигаемся дальше.
Этот олень должен быть лёгкой добычей для алгоритма обнаружения границ. Нужно очистить изображение, чтобы раскрашивание было лёгким. И, к счастью, для этого тоже есть готовый алгоритм:
![](https://habrastorage.org/webt/id/hj/rb/idhjrbvwsoj9ykvospq1-dvzuoo.png)
Это, наверное, самый важный шаг. Мы уберём все посторонние детали и оставим чёткие линии. Цвет немного странный, но решить эту проблему несложно. Разделим изображение на цветовые полосы и выберем ту, где линии наиболее чёткие:
![](https://habrastorage.org/webt/et/ud/h0/etudh0_ntaxkkrqrsgauajkcjpg.png)
Теперь линии чёткие, но сама палитра пока не подходит для печати, потому что в вашем принтере закончатся чернила, да и вашему ребёнку не понравится раскрашивать картинку на чёрном фоне. Так что инвертируем цвета. Установим для x пороги max-black и max-white, чтобы сделать линии еще более чёткими:
![](https://habrastorage.org/webt/jx/bn/hi/jxbnhik9baoqvltijnpkguoxuqu.png)
Теперь обратим внимание, что на картинке осталось много пустого места, поэтому обрежем её:
![](https://habrastorage.org/webt/1z/ew/nw/1zewnwhgtc2f1b0vhgj8jgxclls.png)
Ну и всё. Сохраним картинку в формате PDF (для печати):
Вот так можно легко самостоятельно сделать раскраски для ваших детей: минимум рутины, максимум программирования!
Эпичные серверы — это VPS на Linux или Windows с мощными процессорами семейства AMD EPYC и очень быстрыми NVMe дисками Intel. Расходятся, как горячие пирожки!
![](https://habrastorage.org/webt/ln/w6/2o/lnw62ocrtw13sed7cnk3eteg02q.jpeg)
Недавно мой ребёнок захотел сделать раскраску для персонажа из любимого мультфильма. Очевидным решением было использовать какой-нибудь графический редактор для Linux (потому что я линуксоид), но потом я вспомнил, что я ленивый человек.
К счастью, я знаком с Python и JupyterLab. Посмотрим, насколько Jupyter облегчит задачу.
В первую очередь, нам, конечно, понадобится современная версия Python (если вы пользователь macOS, вы можете следовать этому руководству). Затем нужно установить и открыть JupyterLab и Pillow — форк библиотеки Python Imaging Library (PIL):
$ python -V
Python 3.8.5
$ pip install jupyterlab pillow
……………………..
$ jupyter lab
В данном случае мы хотим сделать раскраску с изображением оленя. Для начала загрузим изображение и сохраним его локально. Лучше всего использовать картинки с Creative Commons или другой открытой лицензией, чтобы не заморачиваться с авторскими правами. В этом примере я использовал изображение с открытой лицензией от 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
![](https://habrastorage.org/webt/xp/mq/e8/xpmqe8rd1nrrfkdy5kemhtvfff4.png)
Прекрасно. Двигаемся дальше.
Этот олень должен быть лёгкой добычей для алгоритма обнаружения границ. Нужно очистить изображение, чтобы раскрашивание было лёгким. И, к счастью, для этого тоже есть готовый алгоритм:
from PIL import ImageFilter
edges = smaller.filter(ImageFilter.FIND_EDGES)
edges
![](https://habrastorage.org/webt/id/hj/rb/idhjrbvwsoj9ykvospq1-dvzuoo.png)
Это, наверное, самый важный шаг. Мы уберём все посторонние детали и оставим чёткие линии. Цвет немного странный, но решить эту проблему несложно. Разделим изображение на цветовые полосы и выберем ту, где линии наиболее чёткие:
bands = edges.split()
bands[0]
![](https://habrastorage.org/webt/et/ud/h0/etudh0_ntaxkkrqrsgauajkcjpg.png)
Теперь линии чёткие, но сама палитра пока не подходит для печати, потому что в вашем принтере закончатся чернила, да и вашему ребёнку не понравится раскрашивать картинку на чёрном фоне. Так что инвертируем цвета. Установим для x пороги max-black и max-white, чтобы сделать линии еще более чёткими:
outline = bands[0].point(lambda x: 255 if x<100 else 0)
outline
![](https://habrastorage.org/webt/jx/bn/hi/jxbnhik9baoqvltijnpkguoxuqu.png)
Теперь обратим внимание, что на картинке осталось много пустого места, поэтому обрежем её:
outline.crop((10, 200, 300, 400))
![](https://habrastorage.org/webt/1z/ew/nw/1zewnwhgtc2f1b0vhgj8jgxclls.png)
Ну и всё. Сохраним картинку в формате PDF (для печати):
outline.save("deer.pdf")
Вот так можно легко самостоятельно сделать раскраски для ваших детей: минимум рутины, максимум программирования!
На правах рекламы
Эпичные серверы — это VPS на Linux или Windows с мощными процессорами семейства AMD EPYC и очень быстрыми NVMe дисками Intel. Расходятся, как горячие пирожки!
![](https://habrastorage.org/webt/8p/3v/z4/8p3vz47nluspfyc0axlkx88gdua.png)