- 1. Operasi dan Masking Bitwise
- 2. Konvolusi & Pemburaman
- 3. Sharpening - Membalik blur gambar
- 4. Threshoding (Binarisasi)
- 5. Pelebaran, Erosi, Pembukaan / Penutupan
- 6. Deteksi tepi dan gradien gambar
- 14. Transformasi Perspektif & Affine
- 8. Aplikasi Sketsa Langsung
Pada tutorial sebelumnya kita telah belajar tentang OpenCV dan melakukan beberapa pengolahan gambar dasar dan kemudian pada tutorial berikutnya kita telah melakukan beberapa manipulasi gambar di OpenCV seperti cropping, rotasi, transformasi gambar dll. beberapa lagi teknik manipulasi gambar seperti dan di akhir tutorial kita akan membangun program python-opencv untuk membuat live sketch dari webcam live feed. Aplikasi ini akan menggunakan banyak fungsi pemrosesan gambar yang telah kita pelajari sejauh ini atau akan dipelajari dalam tutorial ini, jadi ini akan menjadi contoh praktis yang baik untuk mencakup semua fungsi.
Seperti yang diceritakan pada tutorial sebelumnya, OpenCV adalah Open Source Commuter Vision Library yang memiliki antarmuka C ++, Python, dan Java serta mendukung Windows, Linux, Mac OS, iOS dan Android. Sehingga bisa dengan mudah di install di Raspberry Pi dengan lingkungan Python dan Linux. Dan Raspberry Pi dengan OpenCV dan kamera terpasang dapat digunakan untuk membuat banyak aplikasi pemrosesan gambar real-time seperti Deteksi wajah, kunci wajah, pelacakan objek, deteksi pelat nomor mobil, sistem keamanan rumah, dll.
Dalam tutorial ini, kita akan melihat beberapa manipulasi gambar lagi menggunakan Python OpenCV. Di sini kita akan belajar menerapkan fungsi berikut pada gambar menggunakan Python OpenCV:
- Operasi dan Masking Bitwise
- Konvolusi & Pemburaman
- Sharpening - Membalik blur gambar
- Thresholding (Binarisasi)
- Pelebaran, Erosi, Pembukaan / Penutupan
- Deteksi tepi dan gradien gambar
- Transformasi Perspektif & Affine
- Aplikasi Sketsa Langsung
1. Operasi dan Masking Bitwise
Operasi bitwise membantu Anda dalam masking gambar dan membantu Anda membuat beberapa gambar sederhana.
Membuat persegi
import cv2 import numpy as np #kami hanya menggunakan dua dimensi karena ini adalah gambar grayscale, jika kami menggunakan gambar #colored, kami menggunakan rectangle = np.zeros ((300.300,3), np.uint8) # Membuat persegi persegi = np.zeros ((300.300), np.uint8) cv2. rectangle (persegi, (50,50), (250.250), 255, -1) cv2.imshow ("square", square) cv2. waitKey (0)
Membuat elips
elips = np.zeros ((300.300), np.uint8) cv2.ellipse (elips, (150.150), (150.150), 30,0.180.255, -1) cv2.imshow ("elips", elips) cv2.waitKey (0)
Bereksperimen dengan operasi bitwise
#AND_shows hanya di tempat keduanya berpotongan
BitwiseAND = cv2.bitwise_and (persegi, elips) cv2.imshow ("AND", BitwiseAND) cv2.waitKey (0)
#OR_shows hanya di mana persegi atau elips berada
BitwiseOR = cv2.bitwise_or (persegi, elips) cv2.imshow ("OR", BitwiseOR) cv2.waitKey (0)
#XOR_shows hanya jika ada dengan sendirinya
BitwiseXOR = cv2.bitwise_xor (persegi, elips) cv2.imshow ("XOR", BitwiseXOR) cv2.waitKey (0)
#NOT_shows semua yang bukan bagian dari elips dan operasi NOT hanya dapat diterapkan ke satu gambar
BitwiseNOT_elp = cv2.bitwise_not (elips) cv2.imshow ("NOT_ellipse", BitwiseNOT_elp) cv2.waitKey (0) cv2.destroyAllWindows ()
2. Konvolusi & Pemburaman
Sebuah konvolusi adalah operasi matematika dilakukan pada dua fungsi menghasilkan fungsi ketiga yang biasanya versi modifikasi dari fungsi aslinya.
Gambar keluaran = gambar Ukuran Kernel Fungsi
Dalam visi komputer kami menggunakan kernel untuk menentukan ukuran di mana kami menjalankan fungsi manipulasi kami atas gambar kami.
Blurring adalah operasi di mana kami rata-rata piksel dalam suatu wilayah (Kernel)
OpenCV mengaburkan gambar dengan menerapkan kernel, kernel memberi tahu Anda cara mengubah nilai piksel tertentu dengan menggabungkannya dengan jumlah piksel tetangga yang berbeda, kernel diterapkan ke setiap piksel dalam gambar satu per satu untuk menghasilkan gambar akhir.
Sederhananya, konvolusi gambar hanyalah perkalian bijak elemen dari dua matriks yang diikuti dengan penjumlahan.
Kami hanya dapat memahaminya dengan contoh berikut.
Di atas adalah Kernel 3X3.
Kami mengalikan dengan 1/25 untuk menormalkan, yaitu jumlah 1, kami telah meningkatkan intensitas atau menurunkan intensitas seperti dalam kasus mencerahkan atau menggelapkan gambar.
Mari kita uji opencv blurring method filter2D, yang diberikan oleh fungsi cv2.filter2D (image, -1, kernel)
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
#membuat matriks kernel 3x3
kernel_3x3 = np.ones ((3,3), np.float32) / 9
# kami menggunakan cv2.filter2D untuk menggabungkan kernel dengan sebuah gambar
blurred = cv2.filter2D (image, -1, kernel_3x3) cv2.imshow ('3x3_blurring', blurred) cv2.waitKey (0)
#membuat matriks kernel 7x7
kernel_7x7 = np.ones ((7,7), np.float32) / 49
# kami menggunakan cv2.filter2D untuk menggabungkan kernel dengan sebuah gambar
blurred = cv2.filter2D (image, -1, kernel_7x7) cv2.imshow ('7x7_blurring', blurred) cv2.waitKey (0) cv2.destroyAllWindows ()
Ada juga jenis metode kabur lainnya:
cv2.blur - Nilai rata-rata di atas jendela tertentu.
cv2.GaussianBlur - Serupa tetapi menggunakan jendela Gaussian (lebih menekankan pada titik di sekitar pusat).
cv2.medianBlur– Menggunakan median dari semua elemen di jendela.
cv2.bilateralFilter– Mengaburkan sekaligus menjaga ketajaman tepi, ini mempertahankan detail tepi dan garis.
Kita akan lihat satu persatu di bawah ini, pertama tampilkan gambar aslinya menggunakan kode di bawah ini:
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
cv2.blur:
Dalam metode ini, rata-rata dilakukan dengan menggabungkan gambar dengan filter kotak yang dinormalisasi, ini mengambil tempat di bawah kotak dan menggantikan elemen pusat. Di sini ukuran kotak harus ganjil dan positif .
# cv2.blur blur = cv2.blur (gambar, (3,3)) cv2.imshow ('Averaging', blur) cv2.waitKey (0)
cv2.GaussianBlur:
# cv2.GaussianBlur #bukan filter kotak, mari coba kernel Gaussian Gaussian = cv2.GaussianBlur (image, (7,7), 0) cv2.imshow ('Gaussian blurring', Gaussian) cv2.waitKey (0)
cv2.medianBlur:
Dibutuhkan median dari semua piksel di bawah area kernel dan elemen pusat diganti dengan nilai median ini.
# cv2.medianBlur #mengambil median dari semua piksel di bawah area kernel dan elemen tengah #diganti dengan nilai median ini. median = cv2.medianBlur (gambar, 5) cv2.imshow ('median kabur', median) cv2.waitKey (0)
cv2.bilateralFilter:
Bilateral sangat efektif dalam menghilangkan kebisingan sambil menjaga ujung-ujungnya tetap tajam
# cv2.bilateralFilter #Bilateral sangat efektif dalam menghilangkan noise sambil menjaga tepi tajam bilateral = cv2.bilateralFilter (image, 9,75,75) cv2.imshow ('bilateral blurring', bilateral) cv2.waitKey (0) cv2. destroyAllWindows ()
Image De-noising-non Local berarti Denoising
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
#parameter after None adalah kekuatan filter 'h' (5-10 adalah rentang yang baik) #next adalah h untuk komponen warna, setel nilai yang sama dengan h lagi
dst = cv2.fastNlMeansDenoisingColored (image, None, 6,6,7,21) cv2.imshow ('Fast means denois', dst) cv2.waitKey (0) cv2.destroyAllWindows ()
Ada 4 variasi denoising cara non-lokal
cv2.fastNlMeansDenoising () - untuk gambar skala abu-abu tunggal
cv2.fastNlMeansDenoisingColored () - Gambar berwarna tunggal
cv2.fastNlmeansDenoisingMulti () - untuk urutan gambar grayscale
cv2.fastNlmeansDenoisingcoloredMulti () - untuk urutan gambar berwarna
3. Sharpening - Membalik blur gambar
Penajaman adalah kebalikan dari pengaburan, ini memperkuat atau menekankan pada bagian tepi gambar.
Kernel =,,
Matriks kernel kami berjumlah satu, jadi tidak perlu dinormalisasi (yaitu dikalikan dengan faktor kecerahan yang sama seperti aslinya), jika kernel tidak dinormalisasi ke 1, gambar akan menjadi lebih cerah atau lebih gelap.
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
kernel_sharpening = np.array (,
])
#aplikasi penajaman kernel untuk memasukkan gambar
sharpened = cv2.filter2D (image, -1, kernel_sharpening) cv2.imshow ('gambar yang diasah', dipertajam) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Threshoding (Binarisasi)
Thresholding adalah tindakan mengubah gambar menjadi bentuk biner. Dalam pembukaan ada fungsi terpisah untuk thresholding yang didefinisikan sebagai
Cv2.threshold (gambar, nilai ambang batas, nilai Max, jenis ambang batas)
Ada jenis ambang berikut:
- cv2.THRESH_BINARY - paling umum
- cv2. THRESH_BINARY_INV - paling umum
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2. THRESH_TOZERO_INV
CATATAN: gambar perlu diubah menjadi grayscale sebelum thresholding
import cv2 import numpy as np #load image as grayscale image = cv2.imread ('gradient.jpg', 0) cv2.imshow ('original', image) cv2.waitKey (0)
#nilai di bawah 127 menjadi 0 (hitam), dan di atas 127 menjadi 255 (putih)
_, thresh1 = cv2.threshold (image, 127.255, cv2.THRESH_BINARY) cv2.imshow ('1 threshold', thresh1) cv2.waitKey (0)
#nilai di bawah 127 menjadi 255 dan nilai di atas 127 menjadi 0 (kebalikan dari di atas)
_, thresh2 = cv2.threshold (image, 127.255, cv2.THRESH_BINARY_INV) cv2.imshow ('2 threshold', thresh2) cv2.waitKey (0)
#nilai di atas 127 dipotong (ditahan) di 127, argumen 255 tidak digunakan.
_, thresh3 = cv2.threshold (image, 127.255, cv2.THRESH_TRUNC) cv2.imshow ('3 thresh trunc', thresh3) cv2.waitKey (0)
#values di bawah 127 pergi ke 0, di atas 127 tidak berubah
_, thresh4 = cv2.threshold (image, 127.255, cv2.THRESH_TOZERO) cv2.imshow ('4 threshold', thresh4) cv2.waitKey (0)
#Revesrse dari atas, di bawah 127 tidak berubah, di atas 127 menjadi nol
_, thresh5 = cv2.threshold (image, 127.255, cv2.THRESH_TOZERO_INV) cv2.imshow ('5 threshold', thresh5) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Pelebaran, Erosi, Pembukaan / Penutupan
Ini adalah operasi di bidang morfologi matematika
Dilasi - menambahkan piksel ke batas objek dalam gambar.
Erosi - Menghapus piksel di batas objek dalam gambar.
Pembukaan - Erosi diikuti oleh pelebaran.
Penutupan - Pelebaran diikuti oleh erosi.
Pembukaan sangat membantu dalam menghilangkan gambar karena pertama-tama menipiskan gambar dengan erosi (menghilangkan noise) dan kemudian melebarkannya.
Kebingungan dengan dilatasi dan erosi
Terkadang terdapat kebingungan antara dilatasi dan erosi biasanya pada gambar dengan background putih, karena opencv menganggap background putih sebagai gambar yang dilatasi atau terkikis daripada gambar aslinya, jadi dalam hal ini erosi berfungsi sebagai dilasi dan sebaliknya, seperti yang ditunjukkan pada contoh gambar ditunjukkan di bawah ini.
Ingat, Dilasi menambahkan piksel ke batas objek dalam gambar sementara Erosi menghapus piksel di batas objek dalam gambar
import cv2 import numpy as np image = cv2.imread ('imagecv.png', 0) cv2.imshow ('original', image) cv2.waitKey (0)
#Erosion
# mari kita tentukan ukuran kernel kita
kernel = np.ones ((5,5), np.uint8)
#sekarang kami mengikis gambar, di sini iterasi berapa kali Anda ingin mengikis gambar
erosi = cv2.erode (gambar, kernel, iterasi = 1) cv2.imshow ('Erosi', erosi) cv2.waitKey (0)
#pelebaran
dilasi = cv2.dilate (image, kernel, iterations = 1) cv2.imshow ('dilation', dilation) cv2.waitKey (0)
#opening, Bagus untuk menghilangkan kebisingan
pembukaan = cv2.morphologyEx (gambar, cv2.MORPH_OPEN, kernel) cv2.imshow ('pembukaan', pembukaan) cv2.waitKey (0)
#closing, Baik untuk menghilangkan kebisingan
penutupan = cv2.morphologyEx (gambar, cv2.MORPH_CLOSE, kernel) cv2.imshow ('menutup', menutup) cv2.waitKey (0) cv2.destroyAllWindows ()
6. Deteksi tepi dan gradien gambar
Deteksi tepi merupakan area yang sangat penting dalam computer vision, terutama saat berhadapan dengan kontur.
Tepi dapat didefinisikan sebagai batas gambar, sebenarnya itu adalah tepi yang menentukan objek dalam gambar, mereka menyimpan banyak informasi tentang gambar.
Secara formal Tepi dapat didefinisikan sebagai perubahan mendadak (diskontinuitas) pada gambar dan dapat menyandikan informasi sebanyak piksel.
Gambar di atas menunjukkan bagaimana computer vision mengidentifikasi dan mengenali gambar tersebut.
Algoritma deteksi tepi: - Ada tiga tipe utama dari algoritma deteksi tepi
- Sobel - untuk menekankan pada gambar vertikal atau horizontal.
- Laplacian - optimal karena tingkat kesalahan yang rendah, tepi yang terdefinisi dengan baik, dan deteksi yang akurat.
- Algoritme deteksi Canny Edge (dipindahkan oleh john.F.Canny pada tahun 1986)
1. Menerapkan Gaussian blur
2. Menemukan gradien intensitas gambar
3. menerapkan penekanan non-maksimum (yaitu menghapus piksel yang bukan tepi).
4. Histeresis menerapkan ambang batas (yaitu jika piksel berada dalam ambang batas atas dan bawah, ini dianggap sebagai tepi)
import cv2 import numpy as np image = cv2.imread ('input.jpg', 0) height, width = image.shape
#sobel
#extraksi tepi sobel
sobel_x = cv2.Sobel (gambar, cv2.CV_64F, 0,1, ksize = 5) sobel_y = cv2.Sobel (gambar, cv2.CV_64F, 1,0, ksize = 5) cv2.imshow ('asli', gambar) cv2.waitKey (0) cv2.imshow ('sobelx', sobel_x) cv2.waitKey (0)
#Jelas
cv2.imshow ('sobely', sobel_y) cv2.waitKey (0)
sobel_OR = cv2.bitwise_or (sobel_x, sobel_y) cv2.imshow ('sobelOR', sobel_OR) cv2.waitKey (0)
#laplaian
laplacian = cv2.Laplacian (gambar, cv2.CV_64F) cv2.imshow ('Laplacian', laplacian) cv2.waitKey (0)
Algoritme deteksi tepi #canny menggunakan nilai gradien sebagai ambang
#Dalam cerdik kita perlu memberikan dua nilai: ambang1 dan ambang2.
# gradien yang lebih besar dari ambang 2 dianggap sebagai tepi.
# gradien apa pun yang lebih besar dari ambang 1 dianggap tidak menjadi tepi.
#values di antara ambang 1 dan threshold 2 yang baik sebagai tepi atau non-tepi
#on bagaimana intensitas mereka terhubung, dalam hal ini kasus setiap nilai di bawah 60 yang dianggap
#non tepi wheareas setiap nilai di atas 120 dianggap sebagai tepi.
canny = cv2.Canny (image, 60.120) cv2.imshow ('canny', canny ) cv2.waitKey (0) cv2.destroyAllWindows ()
14. Transformasi Perspektif & Affine
Mari kita mundur selangkah dan melihat transformasi affine dan non-affine, gambar asli yang ditunjukkan di bawah ini jelas merupakan gambar non-affine karena tepinya akan bertemu di beberapa titik namun, kita dapat meluruskannya dengan membelokkan dan mengambil perspektif mengubah.
Untuk transformasi perspektif ini kita membutuhkan empat koordinat dari gambar asli dan kemudian empat titik dari gambar keluaran, mereka dilambangkan dengan points_A dan points_B. Pertama dengan bantuan titik-titik ini kami menghitung matriks transformasi, M dengan bantuan fungsi getPerspectiveTransform.
Dan kemudian matriks ini diberikan ke fungsi warpPerspective untuk menghasilkan keluaran akhir.
Sekarang mari kita coba transformasi Perspektif.
impor cv2 impor numpy sebagai np impor matplotlib.pyplot sebagai plt image = cv2.imread ('paper.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
#koordinasi dari 4 sudut gambar asli
points_A = np.float32 (,,,])
#koordinat 4 sudut keluaran yang diinginkan
#kami menggunakan rasio kertas A4 1: 1,41
points_B = np.float32 (,,,])
#menggunakan dua set dari dua titik untuk menghitung matriks transformasi prespektif , M
M = cv2.getPerspectiveTransform (points_A, points_B) warped = cv2.warpPerspective (image, M, (420.594)) cv2.imshow ('warpprespective', warped) cv2.waitKey (0) cv2.destroyAllWindows ()
Transformasi affine lebih mudah daripada transformasi non-affine karena kita hanya membutuhkan tiga poin untuk mendapatkan transformasinya. Seluruh proses berjalan sama tetapi alih-alih transformasi perspektif, kami sekarang memiliki transformasi affine dan juga kami mendefinisikan kolom dan baris di warpAffine dari fungsi bentuk alih-alih memasukkannya secara manual.
impor cv2 impor numpy sebagai np impor matplotlib.pyplot sebagai plt image = cv2.imread ('box.jpg') baris, cols = image.shape cv2.imshow ('original', image) cv2.waitKey (0)
#koordinasi dari 3 sudut gambar asli
points_A = np.float32 (,,])
# koordinat 3 sudut keluaran yang diinginkan
#kami menggunakan rasio kertas A4 1: 1,41
points_B = np.float32 (,,])
#menggunakan dua set dari dua titik untuk menghitung matriks Affine
#transformation, M
M = cv2.getAffineTransform (points_A, points_B) warped = cv2.warpAffine (gambar, M, (kolom, baris)) cv2.imshow ('warpaffine', warped) cv2.waitKey (0) cv2.destroyAllWindows ()
8. Aplikasi Sketsa Langsung
Pertama-tama, ucapkan selamat kepada diri Anda sendiri bahwa Anda telah menyelesaikan proyek mini ini setelah membaca semua fungsi manipulasi gambar di atas. Jadi dalam proyek mini Python OpenCV ini kita akan mempelajari beberapa konsep baru tentang loop dan fungsi. Jika Anda terbiasa dengan pemrograman, Anda harus memiliki gagasan yang lebih luas tentang apa itu fungsi dan loop. Namun, dalam python konsep dasar dari loop dan fungsi tetap sama tetapi metode untuk mendefinisikannya sedikit berubah.
Jadi pada permulaan program ini kita dapat melihat sekelompok pernyataan tertentu di bawah " sketsa def (gambar): " ini adalah definisi formal dari suatu fungsi sekelompok pernyataan yang bekerja bersama untuk keluaran tertentu.
Jadi sketsa ini adalah sebuah fungsi, dalam python fungsi didefinisikan dengan “def” dan diakhiri dengan tanda “:”. Juga pernyataan yang diperlukan untuk berada di dalam fungsi atau Anda dapat mengatakan mana yang diperlukan agar fungsi berfungsi dengan baik, disejajarkan secara otomatis oleh fungsi tersebut. Jadi untuk keluar dari fungsi, pernyataan harus benar-benar rata kiri. Untuk referensi lebih lanjut Anda bisa merujuk ke google tentang bagaimana fungsi-fungsi didefinisikan di python.
Jadi dalam fungsi sketsa ini kami telah memperkenalkan beberapa lapisan pemrosesan gambar yang digabungkan bersama untuk menghasilkan keluaran. Pertama, citra diubah menjadi grayscale sehingga opencv dapat memprosesnya dengan mudah dan kemudian diaplikasikan Gaussian blur pada citra grayscale untuk mengurangi noise. Kemudian tepi diekstraksi dengan bantuan algoritma pendeteksian tepi canny, kemudian pembalikan biner diterapkan pada citra tepi yang ditentukan, di sini pembalikan biner juga dapat dilakukan dengan bitwise_NOT tetapi kami sengaja memilih pembalikan biner ambang ini karena memberikan kebebasan untuk mengatur parameternya sampai kita mendapatkan gambar yang jelas.
Juga untuk dicatat bahwa fungsi mengambil gambar argumen dan mengembalikan dua argumen ret dan mask. Sedangkan ret adalah Boolean yang mengatakan bahwa fungsi berjalan dengan sukses atau tidak dan mask adalah keluaran akhir dari fungsi yaitu citra yang diproses.
Kemudian konsep kedua adalah mengoperasikan webcam secara openencv yang dilakukan dengan fungsi cv2.VideoCapture (0) , yaitu menyimpan image dalam sebuah object cap yang dapat dibaca dengan fungsi cap.read () , juga disini untuk diperhatikan cap tersebut. read () berada di dalam while loop yang tak terbatas karena terus-menerus harus menangkap gambar, untuk memberikan kesan video langsung, di mana frame rate video akan menjadi frame rate webcam Anda yang sebagian besar antara 24 hingga 60 fps.
cap.read () mengembalikan ret dan bingkai, di mana ret adalah Boolean yang menunjukkan bahwa fungsi berhasil dijalankan atau tidak dan bingkai berisi gambar yang diambil oleh webcam.
Di bawah ini adalah kode OpenCV Python lengkap untuk menjalankan Sketsa Langsung
impor cv2 impor numpy sebagai np #sketch fungsi penghasil def sketsa (gambar): #convert gambar menjadi grayscale img_gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) #membersihkan gambar menggunakan Gaussian blur img_gray_blur = cv2.GaussianBlur (img_gray, (5,5), 0) #extract edge canny_edges = cv2.Canny (img_gray_blur, 10,70) # lakukan pembalikan binarisasi ret citra , mask = cv2.threshold (canny_edges, 70.255, cv2.THRESH_BINARY_INV) return mask #inisialisasi webcam, cap adalah objek yang disediakan oleh video capture #it berisi Boolean yang menunjukkan apakah itu berhasil (ret) #it juga berisi gambar yang dikumpulkan dari webcam (frame) cap = cv2.VideoCapture (0) sementara True: ret, frame = cap.read () cv2.imshow ('LiveSketcher', sketch (frame)) if cv2.waitKey (1) == 13: # 13 adalah enterkey break #release kamera dan tutup jendela, ingatlah untuk melepaskan webcam dengan bantuan cap.release () cap.release () cv2.destroyAllWindows ()
Jadi ini adalah akhir dari Bagian 2 manipulasi Gambar dengan Python-OpenCV. Untuk memahami visi komputer dan OpenCV dengan baik, baca artikel sebelumnya (Memulai Python OpenCV dan Manipulasi Gambar dengan Python OpenCV (Bagian 1) dan Anda akan dapat membuat sesuatu yang keren dengan Computer Vision.