Як перетворити будь-яке зображення на ескіз олівцем з 10 рядками коду

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

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

Зображення - це в основному масив чисел для Python. Тож ми можемо виконувати різноманітні маніпуляційні маніпуляції, щоб отримати дуже цікаві результати. У цій публікації я розповідаю про те, як зменшити зображення у контур «олівця».

Сходинки

Процес досить простий:

  1. Зображення у відтінках сірого
  2. Переверніть його
  3. Розмийте перевернуте зображення
  4. Dodge поєднує розмите зображення та відтінки сірого.

Ми можемо вибрати будь-яке зображення з Інтернету. Я піду з цим зображенням індійського гравця в крикет Вірата Колі:

1. Завантажити зображення

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

Ви можете побачити, як Python бачить це зображення з shapeатрибутом:

start_img.shape(196, 160, 30)

Отже, це триканальне зображення розміром 196x160.

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)

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 і Merge

Режим змішування 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)

І це все!

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)

Кінцевий результат

Весь код у дії

Тут у нас немає багато місця для гри, за винятком параметра сигма при розмитті.

Зі збільшенням сигми картинка стає чіткішою, але час роботи також збільшується. Отже, сигма з 5 добре працює для нас.

Згорнутий код:

Я пообіцяв 10 рядків або менше, отже:

Як завжди, ви можете знайти весь детальний код на моєму GitHub.

PS ось як я створив свій середній DP. Якщо вам подобається цей щоденник, покажіть ❤️ :)

Також я не володію цим образом Вірата. Сподіваюся, він не проти!