Как преобразовать любое изображение в эскиз карандашом из 10 строк кода

1656576131 kak preobrazovat lyuboe izobrazhenie v eskiz karandashom iz 10 strok

автор Ришав Агарвал

Используйте базовое компьютерное видение и библиотеку Numpy Python

Меня всегда увлекало компьютерное зрение, и особенно его способность манипулировать изображениями.

Изображение – это в основном массив чисел для Python. Таким образом мы можем выполнять различные матричные манипуляции, чтобы получить очень интересные результаты. В этой публикации я рассказываю о том, как уменьшить изображение в контуре «карандаш».

Лестница

Процесс достаточно прост:

  1. Оттенки серого изображения
  2. Переверните его
  3. Размойте перевернутое изображение
  4. Dodge смешивает размытые и серые изображения.

Мы можем выбрать любое изображение из Интернета. Я буду использовать это изображение индийского игрока в крикет Вирата Коли:

1*TG0CeJvuv1iwskaCQSEyNA

1. Загрузите изображение

import imageioimg=" = imageio.imread(img)
1*v-q4is6XGAQ6XLYI2m7NzQ
Начальное изображение

Вы можете увидеть, как Python видит это изображение с помощью shape атрибут:

start_img.shape(196, 160, 30)

Следовательно, это трехканальное изображение размером 196×160.

2. Оттенки серого

Затем делаем изображение черно-белым.

Numpy не имеет встроенной функции для шкалирования серого, но мы можем легко преобразовать изображение с помощью формулы. Почему эта формула работает, вы можете узнать здесь.

Y= 0.299 R + 0.587 G + 0.114 B

Итак, наша функция будет выглядеть так:

import numpy as npdef grayscale(rgb): return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])

Применение оттенков серого:

gray_img = grayscale(start_img)
1*XOYmVdB9JvBtPAIkpnPVRw
Изображение в оттенках серого

3. Инвертировать изображение

Мы можем инвертировать изображения, просто вычитая из 255, поскольку изображения в оттенках серого являются 8-битными изображениями или имеют максимум 256 тонов.

inverted_img = 255-gray_img
1*k47Y4d4kAFP3tTydH2xlcQ
Перевернутое изображение

4. Размытие изображения

Теперь мы размоем перевернутое изображение. Размывание осуществляется путем применения фильтра Гаусса к перевернутому изображению. Ключевой здесь является дисперсия функции Гаусса или сигмы.

С увеличением сигмы изображение становится более размытым. Sigma контролирует степень дисперсии и, таким образом, степень размытия.

import scipy.ndimageblur_img = scipy.ndimage.filters.gaussian_filter(inverted_img,sigma=5)
1*sS1PIpHogxUKPNDRkOBLuQ
Большее размытие при увеличении сигмы

5. Уклонение и слияние

Режим смешивания Color Dodge делит нижний слой на перевернутый верхний слой. Это осветляет нижний слой в зависимости от значения верхнего слоя. У нас размытое изображение, выделяющее самые смелые края.

Поскольку все наши изображения считываются с помощью Numpy, то все вычисления матрицы очень быстры.

def dodge(front,back): result=front*255/(255-back)  result[result>255]=255 result[back==255]=255 return result.astype(‘uint8’)
final_img= dodge(blur_img,gray_img)
1*K8GCJlziwZm3NmONoy3B7g
Окончательное изображение

И все это!

6. Постройте и сохраните

Мы можем построить наше окончательное изображение с помощью plt.imgshow. Обратите внимание, что нам нужно сохранить cmap аргумент равен “gray”.

import matplotlib.pyplot as pltplt.imshow(final_img, cmap=”gray”)

Мы можем сохранить изображение с помощью:

plt.imsave(‘img2.png’, final_img, cmap=’gray’, vmin=0, vmax=255)

Конечный результат

1*cFcDUhcYTBx4AtGpXzeyXw

Весь код в действии

1*h94l7xWnXk_6dbzDUuPamw
Каждый этап алгоритма

Здесь у нас не так много места для игры, за исключением параметра sigma при размывании.

С увеличением сигмы изображение становится более четким, но время выполнения также увеличивается. Следовательно, сигма 5 хорошо работает для нас.

1*Xdeu0DckWzCXMX6P1TwGzA
эффект увеличения сигмы

Краткий код:

Я обещал 10 строк или меньше, так вот:

Как всегда, вы можете найти весь подробный код на моем GitHub.

PS Вот как я создал свой Medium DP. Если вам нравится этот блог, покажите немного ❤️ 🙂

Также мне не принадлежит образ Вирата. Надеюсь, он не против!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *