Contoh Cartooning#

Import Requirement#

import cv2
from IPython.display import Image, display

Kelas Cartooning#

Mengurangi Detail Gambar dan meningkatkan garis tepi

class Cartoonizer:
  def __init__(self):
    pass

  def render(self, img_rgb):
    img_rgb = cv2.imread(img_rgb) # membaca gambar
    img_rgb = cv2.resize(img_rgb, (1366,768)) # mengubah ukuran menjadi 1366x768 pixel (mengurangi resolusi gambar)
    numDownSamples = 2 # jumlah penurunan resolusi gambar
    numBilateralFilters = 50 # jumlah proses filter bilateral (mengurangi detail gambar)

    # -- LANGKAH 1 --

    # Downsample image dengan piramida Gaussian
    img_color = img_rgb  # variabel untuk gambar yang telah disederhanakan

    # Proses DownSample
    for _ in range(numDownSamples):
      img_color = cv2.pyrDown(img_color) # mengurangi ukuran gambar ke setengahnya dalam setiap dimensi (lebar dan tinggi)

    # Proses Filter Bilateral
    for _ in range(numBilateralFilters):
      img_color = cv2.bilateralFilter(img_color, 9, 9, 7) # pengaburan yang mempertahankan tepi dalam gambar sambil mengurangi noise
      # gambar)
      # Diameter daerah di sekitar tiap piksel yang digunakan
      # Nilai yang mengontrol seberapa besar pengaruh piksel dari piksel dengan piksel yang sedang diproses
      # Nilai yang mengontrol seberapa besar pengaruh piksel yang memiliki perbedaan intensitas warna dengan piksel yang sedang diproses

    # UpSample ke ukuran asli
    for _ in range(numDownSamples):
      img_color = cv2.pyrUp(img_color) # memperbesar setiap piksel dan menambahkan piksel-piksel baru

    # -- LANGKAH 2 --
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) # konversi gambar berwarna menjadi gambar grayscale
    img_blur = cv2.medianBlur(img_gray, 3) # blur gambar grayscale (menggantikan nilai piksel kernel dengan nilai median dari daerah kernel tersebut)

    # -- LANGKAH 3 --
    img_edge = cv2.adaptiveThreshold(img_blur, 255,
        cv2.ADAPTIVE_THRESH_MEAN_C,
        cv2.THRESH_BINARY, 9, 2) # menentukan treshold (batas dari rata-rata intensitas di sekitar setiap piksel (dengan kernel 9x9) dikurangi dengan konstanta 2.)

    # -- LANGKAH 5 --
    (x,y,z) = img_color.shape # tinggi, lebar, dan jumlah saluran warna dalam gambar.
    img_edge = cv2.resize(img_edge,(y,x)) # resize ke ukuran asli gambar
    img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) # Mengubah tepi menjadi berwarna
    cv2.imwrite("edge.png",img_edge) # Simpan proses treshold image ke file gambar

    return cv2.bitwise_and(img_color, img_edge) # operasi bitwise AND antara dua citra antar gambar asli dengan gambar treshold

tmp_canvas = Cartoonizer()

file_name = "/content/drive/MyDrive/DeepLearning/Cartooning/Tugas/karapan_sapi.jpg"
res = tmp_canvas.render(file_name)

cv2.imwrite("Cartoon version.jpg", res)

# Menampilkan gambar hasil
display(Image(filename='Cartoon version.jpg'))

cv2.waitKey(0)
cv2.destroyAllWindows()
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-2-c76a8ad032f2> in <cell line: 52>()
     50 
     51 file_name = "/content/drive/MyDrive/DeepLearning/Cartooning/Tugas/karapan_sapi.jpg"
---> 52 res = tmp_canvas.render(file_name)
     53 
     54 cv2.imwrite("Cartoon version.jpg", res)

<ipython-input-2-c76a8ad032f2> in render(self, img_rgb)
      5   def render(self, img_rgb):
      6     img_rgb = cv2.imread(img_rgb) # membaca gambar
----> 7     img_rgb = cv2.resize(img_rgb, (1366,768)) # mengubah ukuran menjadi 1366x768 pixel (mengurangi resolusi gambar)
      8     numDownSamples = 2 # jumlah penurunan resolusi gambar
      9     numBilateralFilters = 50 # jumlah proses filter bilateral (mengurangi detail gambar)

error: OpenCV(4.8.0) /io/opencv/modules/imgproc/src/resize.cpp:4062: error: (-215:Assertion failed) !ssize.empty() in function 'resize'