Використовуйте базовий комп'ютерний зір та бібліотеку Numpy Python
Мене завжди захоплював комп'ютерний зір, і особливо його сила маніпулювати зображеннями.
Зображення - це в основному масив чисел для Python. Тож ми можемо виконувати різноманітні маніпуляційні маніпуляції, щоб отримати дуже цікаві результати. У цій публікації я розповідаю про те, як зменшити зображення у контур «олівця».
Сходинки
Процес досить простий:
- Зображення у відтінках сірого
- Переверніть його
- Розмийте перевернуте зображення
- 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. Якщо вам подобається цей щоденник, покажіть ❤️ :)
Також я не володію цим образом Вірата. Сподіваюся, він не проти!