Cara mengubah gambar menjadi lakaran pensil dengan 10 baris kod

Gunakan visi komputer asas dan perpustakaan Python's Numpy

Saya selalu terpesona dengan penglihatan komputer, dan terutama dengan kekuatannya untuk memanipulasi gambar.

Imej pada dasarnya adalah susunan nombor untuk Python. Oleh itu, kita dapat melakukan pelbagai manipulasi matriks untuk mendapatkan beberapa hasil yang sangat menarik. Dalam catatan ini, saya bercakap tentang bagaimana mengurangkan gambar menjadi garis besar 'pensil'.

Langkahnya

Prosesnya cukup mudah:

  1. Skala kelabu gambar
  2. Balikkannya
  3. Kaburkan gambar terbalik
  4. Dodge menggabungkan gambar yang kabur dan kelabu.

Kita boleh memilih sebarang gambar dari Internet. Saya akan melihat gambar pemain kriket India Virat Kohli ini:

1. Muatkan gambar

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

Anda dapat melihat bagaimana Python melihat gambar ini dengan shapeatribut:

start_img.shape(196, 160, 30)

Jadi ini adalah gambar tiga saluran bersaiz 196x160.

2. Skala kelabu

Kami kemudian menjadikan gambar itu hitam putih.

Numpy tidak mempunyai fungsi bawaan untuk penskalaan abu-abu, tetapi kita dapat dengan mudah menukar gambar menggunakan rumus. Anda boleh mengetahui mengapa formula ini berfungsi di sini.

Y= 0.299 R + 0.587 G + 0.114 B

Jadi fungsi kami akan kelihatan seperti:

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

Menggunakan skala kelabu:

gray_img = grayscale(start_img)

3. Balikkan gambar

Kita boleh membalikkan gambar hanya dengan mengurangkan dari 255, kerana gambar skala abu-abu adalah gambar 8 bit atau maksimum 256 nada.

inverted_img = 255-gray_img

4. Imej Kabur

Kami kini mengaburkan imej terbalik. Pengaburan dilakukan dengan menerapkan penapis Gaussian pada gambar terbalik. Kuncinya di sini adalah varians fungsi Gaussian atau sigma.

Apabila sigma meningkat, gambar menjadi lebih kabur. Sigma mengawal tahap perbezaan dan dengan itu, tahap kekaburan.

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

5. Dodge dan Gabungan

Mod campuran Color Dodge membahagikan lapisan bawah dengan lapisan atas terbalik. Ini meringankan lapisan bawah bergantung pada nilai lapisan atas. Kami mempunyai gambar yang kabur, yang menonjolkan tepi paling tebal.

Oleh kerana semua gambar kami dibaca menggunakan Numpy, semua pengiraan matriks sangat cepat.

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)

Dan itu sahaja!

6. Petak dan simpan

Kita boleh merancang gambar akhir kita menggunakan plt.imgshow. Perhatikan bahawa kita perlu memastikan cmapargumen sama dengan “gray”.

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

Kami dapat menyimpan gambar menggunakan:

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

Keputusan akhir

Keseluruhan kod dalam tindakan

Di sini kita tidak memiliki banyak ruang untuk bermain, kecuali dengan parameter sigma ketika kabur.

Apabila sigma meningkat, gambar menjadi lebih jelas tetapi masa berjalan juga meningkat. Jadi sigma 5 berfungsi dengan baik untuk kita.

Kod pekat:

Saya berjanji 10 baris atau kurang, jadi ini dia:

Seperti biasa, anda boleh menemui keseluruhan kod terperinci di GitHub saya.

PS ini adalah bagaimana saya membuat DP Medium saya. Sekiranya anda menyukai blog ini, tunjukkan beberapa ❤️ :)

Saya juga tidak mempunyai gambar Virat ini. Saya harap dia tidak keberatan!