Hello, pada post kali ini saya akan berbagi sedikit hal mengenai Pengolahan Citra dengan menggunakan OpenCV Python. Lebih tepatnya pada postingan ini kita akan mencoba membuat program yang dapat menyelaraskan (alignment) bentuk suatu citra yang berisi document teks atau cover buku. Hasil output yang diharapkan akan seperti berikut : Show Contents Apa itu Registrasi Citra / Image Registration?Image Registration atau Registrasi Citra adalah proses mengubah kumpulan data yang berbeda pada suatu citra menjadi satu sistem koordinat. Beberapa poin perbedaan yang dapat terjadi pada suatu citra adalah perbedaan sensor, waktu mengambil, atau sudut pandang yang berbeda. Pada registrasi citra akan banyak menggunakan Spatial Transformation, dimana spatial transformation ini merupakan proses pengubahan citra secara geometri dari suatu koordinat menjadi koordinat lain. Perubahan geometri seperti perubahan rotasi, penggeseran, perubahan skala citra dan sebagai nya. Teori Transformasi
Dalam mendeteksi sebuah gambar dokumen, bentuk yang kebanyakan akan ditemukan adalan bentuk Homografi seperti gambar diatas. Homografi mengubah persegi menjadi persegi arbitrer. Pada projek ini saya mencoba mengubah bentuk dari Homography dan mengembalikannya ke bentuk original dengan menggunakan teknik Registrasi Citra menggunakan bantuan OpenCV Python. Bagaimana Tahapan Registrasi Citra?Gambar Proses Registrasi Citra
Mari NgodingMetode yang saya gunakan pada projek ini adalah Registrasi Citra (Image Registration) dengan menggunakan bantuan OpenCV pada python. Pada projek ini registrasi citra membantu Pengenalan Karakter Optik (Optical Character Recognition) pada sebuah dokumen. Source code dapat diakses pada link google colab berikut : https://colab.research.google.com/drive/1Gan_P7cDMYlg_pg-vs5yC10dGU5f0Kgq?usp=sharing Tahap 0: PersiapanPada tahap ini saya akan meng-import library yang dibutuhkan dan membuat beberapa function # import library yang dibutuhkan import cv2 import numpy as np import matplotlib.pyplot as plt ### FUNCTION ## Saya membuat function ini agar tidak menuliskan code berulang kali # 01 Rubah citra menjadi citra abu abu def toGrayscale(image): grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return grayImage # 02 plotting citra dengan pyplot def plotTwoImages(image1, title1, image2, title2): # ukuran plot plt.figure(figsize=[20, 10]) # plotting citra 1 plt.subplot(121) plt.axis("off") plt.imshow(image1) plt.title(title1) # plotting citra 2 plt.subplot(122) plt.axis("off") plt.imshow(image2) plt.title(title2) Tahap 1: Membaca File CitraPada tahap ini akan membaca file citra yang akan diregistrasi dan citra acuan dengan menggunakan OpenCV # Sumber Percobaan path1 = "paper_template.png" # acuan path2 = "paper_needfix.png" # akan diperbaiki # tempat memasukkan sumber source1 = cv2.imread(path1, cv2.IMREAD_COLOR) # gambar yang dijadikan acuan / benar source2 = cv2.imread(path2, cv2.IMREAD_COLOR) # gambar yang akan dirapihkan # merubah gambar ke warna RGB img1 = cv2.cvtColor(source1, cv2.COLOR_BGR2RGB) img2 = cv2.cvtColor(source2, cv2.COLOR_BGR2RGB) # menampilkan gambar dengan plotting plotTwoImages(img1, "Gambar Acuan", img2, "Gambar Bermasalah") Output: Tahap 2: Mencari KeypointsPada tahap ini akan mencari titik titik pada kedua gambar yang akan dicocokkan pada langkah selanjutnya # convert gambar ke citra abu abu img1_gray = toGrayscale(img1) img2_gray = toGrayscale(img2) # Deteksi ORB features dan compute descriptors MAX_NUM_FEATURES = 500 orb = cv2.ORB_create(MAX_NUM_FEATURES) keypoints1, descriptors1 = orb.detectAndCompute(img1_gray, None) keypoints2, descriptors2 = orb.detectAndCompute(img2_gray, None) # menyimpan hasil keypoints pada gambar img1_display = cv2.drawKeypoints(img1, keypoints1, outImage=np.array([]), color=(255, 0, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) img2_display = cv2.drawKeypoints(img2, keypoints2, outImage=np.array([]), color=(255, 0, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) print("Mencari Keypoints pada kedua Gambar") Output: Tahap 3: Mencocokkan Keypoints pada Kedua Gambarsetelah menemukan berbagai keypoints pada kedua gambar, selanjutnya adalah tahap mencocokkan guna untuk menentukan homografi nya # fitur mencocokkan matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) matches = matcher.match(descriptors1, descriptors2, None) # Mengurutkan hasil berdasarkan score matches.sort(key=lambda x: x.distance, reverse=False) # Menghapus keypoints yang tidak cocok numGoodMatches = int(len(matches) * 0.1) matches = matches[:numGoodMatches] # Draw top matches img_matches = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches, None) plt.figure(figsize=[40,10]) plt.imshow(img_matches) plt.axis("off") plt.title("Hasil mencocokan Titik / Keypoints kedua gambar") Output: Tahap 4: Mencari Homografi# Mengambil lokasid dari keypoints yang cocok points1 = np.zeros((len(matches), 2), dtype=np.float32) points2 = np.zeros((len(matches), 2), dtype=np.float32) for i, match in enumerate(matches): points1[i, :] = keypoints1[match.queryIdx].pt points2[i, :] = keypoints2[match.trainIdx].pt # mencari homography homography, mask = cv2.findHomography(points2, points1, cv2.RANSAC) Tahap 5: Menerapkan Registrasi Citra## menggunakan hasil homografi untuk menyelaraskan citra # ambil referensi citra acuan height, width, channels = img1.shape # terapkan pada citra yang bermasalah img2_reg = cv2.warpPerspective(img2, homography, (width, height)) # menampilkan hasil plotTwoImages(img1, "Gambar Acuan", img2_reg, "Hasil Registrasi") Output: KesimpulanSetelah melakukan percobaan hingga berulang kali dengan berbagai sample citra, saya mendapatkan beberap poin penting yaitu penggunaan teknik Registrasi Citra untuk menyelaraskan citra teks yang akan dijadikan dokumen masih sangat memiliki kekurangan. Registrasi citra dapat berjalan baik dan menampilkan hasil yang sesuai ketika titik titik yang ditemukan memiliki lokasi yang cocok. Tidak semua citra mudah ditemukan titik titik yang cocok. Berdasarkan percobaan yang telah saya lakukan registrasi citra ini akan berjalan baik seperti contohnya citra memuat gambar dari sebuah objek yang sama. Contohnya yaitu sebuah buku, buku memiliki sampul atau cover, pada sampul inilah titik titik yang cocok untuk registrasi citra dapat ditemukan dengan lebih mudah. Contoh yang selanjutnya adalah pada citra yang berupa gambar kertas formulir. Pada formulir biasanya akan terdapat sebuah kop atau header dibagian atasnya dan juga terdapat beberapa pertanyaan atau kolom kolom yang harus diisi. Hal ini memudahkan proses pencarian titik titik yang cocok untuk registrasi citra, namun tidak semua citra yang memuat formulir akan mendapatkan hasil registrasi citra yang baik seperti pada contoh yang saya gunakan. Terakhir, citra yang tidak memiliki objek yang sama contohnya seperti kertas folio akan sangat sulit untuk mendapatkan hasil registrasi citra yang baik. Kesimpulannya registrasi citra pada penerapan untuk penyelaraskan teks dokumen menurut saya cocok dilakukan untuk citra yang sama namun memiliki bentuk geometri yang berbeda (seperti sudah digeser, sudah diperbesar, sudah diperkecil, dll) atau setidaknya dalam citra tersebut objek yang akan dijadikan teks dokumen memiliki banyak kesamaan sehingga akan didapat titik titik yang cocok. Terima KasihSekian dari saya, terima kasih telah membaca dan semoga harimu menyenangkan 🙂 keep ngoding lurr! ReferensiUberoi, Annaya. 2021. Image Registration using OpenCV Python. https://www.geeksforgeeks.org/image-registration-using-opencv-python/ diakses pada senin, 18 oktober 2021. Rosebrock, Adrian. 2020. Image Alignment and Registration with OpenCV. https://www.pyimagesearch.com/2020/08/31/image-alignment-and-registration-with-opencv/ diakses pada senin, 18 oktober 2021. Bhattiprolu , Sreenivas. 2019. Image Registration using homography in OpenCV. https://youtu.be/cA8K8dl-E6k dikases pada selasa, 19 oktober 2021. Mallick, Satya. 2016. Homography examples using OpenCV (Python / C++). https://learnopencv.com/homography-examples-using-opencv-python-c/ diakses pada selasa, 10 oktober 2021. Mallick, Satya. 2015. Image Alignment (ECC) in OpenCV (C++ / Python). https://learnopencv.com/image-alignment-ecc-in-opencv-c-python/ diakses pada selasa 19 oktober 2021. Mallick, Satya. 2018. Featured Based Image Alignment using OpenCV (C++/Python). https://learnopencv.com/feature-based-image-alignment-using-opencv-c-python/ diakses pada selasa, 19 oktober 2021. |