de Rishav Agarwal

Cum să transformați orice imagine într-o schiță în creion cu 10 linii de cod

Utilizați viziunea computerizată de bază și biblioteca Numpy a lui Python

Am fost întotdeauna fascinat de viziunea computerizată și mai ales de puterea sa de a manipula imagini.

O imagine este practic o serie de numere către Python. Deci, putem efectua o varietate de manipulări ale matricei pentru a obține rezultate foarte interesante. În această postare, vorbesc despre cum să reduceți o imagine într-un contur „creion”.

Pașii

Procesul este destul de simplu:

  1. Scară de gri a imaginii
  2. Inversează-l
  3. Estompați imaginea inversată
  4. Dodge amestecă imaginea neclară și în tonuri de gri.

Putem alege orice imagine de pe Internet. Voi merge cu această imagine a cricketerului indian Virat Kohli:

Cum sa transformati orice imagine intr o schita in creion cu

1. Încărcați imaginea

import imageioimg="http://static.cricinfo.com/db/PICTURES/CMS/263600/263697.20.jpg"start_img = imageio.imread(img)
Cum sa transformati orice imagine intr o schita in creion cu
Imaginea inițială

Puteți vedea cum Python vede această imagine cu shape atribut:

start_img.shape(196, 160, 30)

Deci, aceasta este o imagine cu trei canale cu dimensiunea 196×160.

2. Scară de gri

Apoi facem imaginea alb-negru.

Numpy nu are nicio funcție încorporată pentru redimensionarea gri, dar putem converti cu ușurință imaginea folosind formula. Puteți afla de ce această formulă funcționează corect aici.

Y= 0.299 R + 0.587 G + 0.114 B

Deci funcția noastră va arăta astfel:

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

Aplicarea în tonuri de gri:

gray_img = grayscale(start_img)
Cum sa transformati orice imagine intr o schita in creion cu
Imagine în tonuri de gri

3. Inversați imaginea

Putem inversa imagini pur și simplu scăzând din 255, deoarece imaginile în tonuri de gri sunt imagini pe 8 biți sau au maximum 256 de tonuri.

inverted_img = 255-gray_img
1611480126 90 Cum sa transformati orice imagine intr o schita in creion cu
Imagine inversată

4. Estompează imaginea

Acum estompăm imaginea inversată. Estomparea se face prin aplicarea unui Filtru gaussian la imaginea inversată. Cheia aici este varianța funcției gaussiene sau sigmei.

Pe măsură ce sigma crește, imaginea devine mai neclară. Sigma controlează amploarea varianței și, astfel, gradul de estompare.

import scipy.ndimageblur_img = scipy.ndimage.filters.gaussian_filter(inverted_img,sigma=5)
1611480126 368 Cum sa transformati orice imagine intr o schita in creion cu
Mai multă estompare la creșterea sigmei

5. Dodge and Merge

Color Dodge modul de amestecare împarte stratul inferior de stratul superior inversat. Acest lucru ușurează stratul inferior în funcție de valoarea stratului superior. Avem imaginea neclară, care evidențiază cele mai îndrăznețe margini.

Deoarece toate imaginile noastre sunt citite folosind Numpy, toate calculele matricei sunt foarte rapide.

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)
1611480127 364 Cum sa transformati orice imagine intr o schita in creion cu
Imagine finală

Si asta e!

6. Complotează și salvează

Putem trage imaginea noastră finală folosind plt.imgshow. Rețineți că trebuie să păstrăm cmap argument egal cu “gray”.

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

Putem salva imaginea folosind:

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

Rezultat final

1611480127 749 Cum sa transformati orice imagine intr o schita in creion cu

Cod întreg în acțiune

1611480127 359 Cum sa transformati orice imagine intr o schita in creion cu
Fiecare etapă a algoritmului

Aici nu avem prea mult spațiu cu care să ne jucăm, cu excepția parametrului sigma în timp ce se estompează.

Pe măsură ce sigma crește, imaginea devine mai clară, dar crește și timpul de rulare. Deci, o sigma de 5 funcționează bine pentru noi.

1611480128 998 Cum sa transformati orice imagine intr o schita in creion cu
efectul creșterii sigmei

Cod condensat:

Am promis 10 linii sau mai puțin, așa că iată:

Ca întotdeauna, puteți găsi întregul cod detaliat pe pagina mea GitHub.

PS așa mi-am creat DP-ul mediu. Dacă îți place acest blog, arată câteva ❤️ 🙂

De asemenea, nu dețin această imagine a lui Virat. Sper că nu se supără!