Cara menggunakan python print align columns

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 :

Cara menggunakan python print align columns
Cara menggunakan python print align columns
Sebelum
Cara menggunakan python print align columns
Cara menggunakan python print align columns
Sesudah

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.

Cara menggunakan python print align columns
Cara menggunakan python print align columns
Cara menggunakan python print align columns
Cara menggunakan python print align columns

Teori Transformasi

Cara menggunakan python print align columns
Cara menggunakan python print align columns

  1. Translation (MOTION_TRANSLATION): Gambar pertama dapat digeser (diterjemahkan) oleh (x , y) untuk mendapatkan gambar kedua. Hanya ada dua parameter x dan y yang perlu kita perkirakan.
  2. Euclidean (MOTION_EUCLIDEAN): Gambar pertama adalah versi yang diputar dan digeser dari gambar kedua. Jadi ada tiga parameter – x, y dan sudut . Anda akan melihat pada Gambar 4, ketika sebuah persegi mengalami transformasi Euclidean, ukurannya tidak berubah, garis paralel tetap sejajar, dan sudut siku-siku tetap tidak berubah setelah transformasi.
  3. Affine (MOTION_AFFINE) : Transformasi affine adalah kombinasi dari rotasi, translasi ( shift ), skala, dan geser. Transformasi ini memiliki enam parameter. Ketika sebuah bujur sangkar mengalami transformasi Affine, garis-garis sejajar tetap sejajar, tetapi garis-garis yang bertemu pada sudut siku-siku tidak lagi tetap ortogonal.
  4. Homografi (MOTION_HOMOGRAPHY): Semua transformasi yang dijelaskan di atas adalah transformasi 2D. Mereka tidak memperhitungkan efek 3D. Transformasi homografi di sisi lain dapat menjelaskan beberapa efek 3D (tetapi tidak semua). Transformasi ini memiliki 8 parameter. Sebuah persegi ketika ditransformasikan menggunakan Homografi dapat berubah menjadi segi empat apa pun.

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?

Cara menggunakan python print align columns
Cara menggunakan python print align columns
Gambar Proses Registrasi Citra

  1. Terdapat dua gambar, gambar sebagai basis untuk dijadikan pembanding dan gambar yang diinput atau yang ingin diregistrasi (dibenarkan / diperbaiki)
  2. Memilih random point (titik acak) untuk dijadikan control point dari gambarnya
  3. Cari koordinat dari control point yang telah ditentukan
  4. Terapkan spatial transform function ke gambar yang diinput
  5. Maka akan dihasilkan sebuah gambar yang sejajar (aligned image)

Mari Ngoding

Metode 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: Persiapan

Pada 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 Citra

Pada 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:

Cara menggunakan python print align columns
Cara menggunakan python print align columns

Tahap 2: Mencari Keypoints

Pada 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:

Cara menggunakan python print align columns
Cara menggunakan python print align columns

Tahap 3: Mencocokkan Keypoints pada Kedua Gambar

setelah 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:

Cara menggunakan python print align columns
Cara menggunakan python print align columns

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:

Cara menggunakan python print align columns
Cara menggunakan python print align columns

Kesimpulan

Setelah 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 Kasih

Sekian dari saya, terima kasih telah membaca dan semoga harimu menyenangkan 🙂 keep ngoding lurr!

Referensi

Uberoi, 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.