Cara mengubah gambar menjadi sketsa pensil dengan 10 baris kode

Gunakan visi komputer dasar dan pustaka Numpy Python

Saya selalu terpesona oleh visi komputer, dan terutama oleh kekuatannya untuk memanipulasi gambar.

Gambar pada dasarnya adalah larik angka untuk Python. Jadi kita bisa melakukan berbagai manipulasi matriks untuk mendapatkan hasil yang sangat menarik. Dalam posting ini, saya berbicara tentang cara mengurangi gambar menjadi garis bentuk 'pensil'.

Langkah langkah

Prosesnya cukup sederhana:

  1. Gambar menjadi abu-abu
  2. Balikkan itu
  3. Buramkan gambar yang dibalik
  4. Dodge memadukan gambar kabur dan abu-abu.

Kami dapat memilih gambar apa pun dari Internet. Saya akan memilih gambar pemain kriket India Virat Kohli ini:

1. Muat 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 dengan ukuran 196x160.

2. Skala abu-abu

Kami kemudian membuat gambar hitam dan putih.

Numpy tidak memiliki fungsi built-in untuk skala abu-abu, tetapi kita dapat dengan mudah mengonversi gambar menggunakan rumus tersebut. Anda dapat mempelajari mengapa rumus ini berfungsi di sini.

Y= 0.299 R + 0.587 G + 0.114 B

Jadi fungsi kita akan terlihat seperti:

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

Menerapkan grayscale:

gray_img = grayscale(start_img)

3. Balikkan gambar

Kita dapat membalikkan gambar hanya dengan mengurangi 255, karena gambar grayscale adalah gambar 8 bit atau memiliki maksimal 256 tone.

inverted_img = 255-gray_img

4. Gambar Buram

Kami sekarang mengaburkan gambar terbalik. Pemburaman dilakukan dengan menerapkan filter Gaussian ke gambar terbalik. Kuncinya di sini adalah varians dari fungsi Gaussian atau sigma.

Saat sigma meningkat, gambar menjadi lebih kabur. Sigma mengontrol tingkat varians dan dengan demikian, tingkat pengaburan.

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

5. Dodge dan Merge

Mode campuran Color Dodge membagi lapisan bawah dengan lapisan atas terbalik. Ini mencerahkan lapisan bawah tergantung pada nilai lapisan atas. Kami memiliki gambar buram, yang menyoroti tepi paling tebal.

Karena semua gambar kami dibaca menggunakan Numpy, semua penghitungan matriks dilakukan dengan 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 dia!

6. Plot dan simpan

Kita bisa memplot gambar akhir kita menggunakan plt.imgshow. Perhatikan bahwa kita perlu menjaga cmapargumen tetap sama “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)

Hasil akhir

Seluruh kode beraksi

Di sini kita tidak memiliki banyak ruang untuk dimainkan, kecuali dengan parameter sigma saat diburamkan.

Saat sigma meningkat, gambar menjadi lebih jelas tetapi waktu berjalan juga meningkat. Jadi sigma 5 bekerja dengan baik untuk kita.

Kode kental:

Saya menjanjikan 10 baris atau kurang, jadi ini dia:

Seperti biasa, Anda dapat menemukan seluruh kode mendetail di GitHub saya.

PS ini adalah bagaimana saya membuat DP Sedang saya. Jika Anda menyukai blog ini, tunjukkan beberapa ❤️ :)

Juga saya tidak memiliki gambar Virat ini. Saya harap dia tidak keberatan!