Рубрики
Без рубрики

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

Автор оригинала: FreeCodeCapm Team.

Ришав Агарваль

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

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

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

Шаги

Процесс довольно прост:

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

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

1. Изображение нагрузки

import imageioimg="http://static.cricinfo.com/db/PICTURES/CMS/263600/263697.20.jpg"start_img = imageio.imread(img)

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

start_img.shape(196, 160, 30)

Так что это три канального изображения размера 196×160.

2. Greyscale.

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

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

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)

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

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

inverted_img = 255-gray_img

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

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

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

import scipy.ndimageblur_img = scipy.ndimage.filters.gaussian_filter(inverted_img,sigma=5)

5. Dodge и объединение

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

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

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)

Вот и все!

6. Сюжет и сохранить

Мы можем построить наше последнее изображение, используя plt.imgshow Отказ Обратите внимание, что нам нужно держать CMAP аргумент равен «Серый» Отказ

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

Мы можем сохранить изображение, используя:

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

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

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

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

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

Конденсированный код:

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

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

PS Это то, как я создал свой средний DP. Если вам нравится этот блог, показать немного ❤️:)

Также я не владею этим изображением вируса. Я надеюсь, что он не возражает!