Membuat Optical Character Recognition (OCR) menggunakan Python

Cara Menggunakan Tesseract untuk Mendeteksi, Melokalkan, dan Teks OCR

Fahmi Salman
Miloo Community
5 min readDec 22, 2021

--

Optical Character Recognition (OCR) adalah teknologi untuk mengenali teks dalam gambar, seperti dokumen dan foto. Kita pasti pernah memotret sebuah teks hanya karena kita terlalu malas untuk mencatat atau mengetik teks, karena mengambil foto membutuhkan waktu lebih sedikit daripada membuat catatan. Untungnya, di smartphone masa kini, kita bisa langsung menerapkan OCR sehingga kita bisa langsung menyalin teks yang kita ambil sebelumnya tanpa harus menulis atau mengetik ulang.

Di Python, kita juga bisa melakukannya hanya dengan menggunakan beberapa baris kode. Salah satu tool OCR yang sering digunakan adalah Tesseract. Tesseract adalah mesin pengenalan karakter optik untuk berbagai sistem operasi. Pada awalnya dikembangkan oleh Hewlett-Packard sebagai perangkat, Kemudian Google mengambil alih pengembangan.

Instalasi

Saat ini, Tesseract tersedia di platform Windows, macOS, dan Linux. Tesseract mendukung Unicode (UTF-8) dan mendukung lebih dari 100 bahasa. Pada artikel ini, kita akan memulai dengan proses instalasi Tesseract OCR, dan menguji ekstraksi teks dalam gambar.

Langkah pertama adalah menginstal Tesseract. Untuk menggunakan library Tesseract, pertama-tama kita harus menginstalnya di sistem kita. Jika Kamu menggunakan Ubuntu, Kamu cukup menggunakan apt-get untuk menginstal Tesseract OCR:

sudo apt-get install tesseract-ocr

Untuk pengguna macOS, kita bisa menggunakan homebrew untuk menginstal Tesseract.

brew install tesseract

Untuk Windows, silahkan kunjungi dokumentasi Tesseract.

Setelah itu, kita instal package Tesseract untuk python, yaitu pytesseract.

$ pip install pytesseract

Implementasi

Setelah instalasi selesai, mari kita gunakan tesseract untuk python. Pertama-tama, kita install dependensi-nya terlebih dahulu.

from PIL import Image
import pytesseract
import numpy as np

Saya akan menggunakan gambar sederhana untuk menguji tesseract. Saya akan menggunakan gambar dibawah.

Sample image

Lalu kita load gambar tadi, dan ubah ke teks menggunakan tesseract.

filename = 'image_01.png'
img1 = np.array(Image.open(filename))
text = pytesseract.image_to_string(img1)

Sekarang, kita lihat hasilnya.

print(text)

Dan inilah hasilnya.

Hasil yang diperoleh dari tesseract cukup baik untuk gambar sederhana. Karena di dunia nyata sulit untuk menemukan gambar yang benar-benar sederhana, jadi saya akan menambahkan noise untuk melihat kinerja tesseract. Saya akan menggunakan gambar di bawah ini.

Sample image with noise

Lakukan proses yang sama seperti sebelumnya.

filename = 'image_02.png'
img2 = np.array(Image.open(filename))
text = pytesseract.image_to_string(img2)
print(text)

Dan inilah hasilnya.

Hasilnya adalah … Tidak ada. Artinya Tesseract tidak bisa membaca kata-kata dalam gambar yang memiliki noise.

mari kita coba menggunakan sedikit pemrosesan gambar untuk menghilangkan noise pada gambar. Disini saya akan menggunakan library Open CV. Dalam percobaan ini, saya menggunakan normalisasi, thresholding, dan image blur.

import numpy as np
import cv2norm_img = np.zeros((img.shape[0], img.shape[1]))
img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)
img = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)[1]
img = cv2.GaussianBlur(img, (1, 1), 0)

Dan hasil dari gambarnya akan menjadi seperti ini.

Gambar sudah cukup bersih, selanjutnya kita akan mencoba lagi dengan proses yang sama seperti sebelumnya. Dan inilah hasilnya.

Dapat dilihat dari gambar diatas bahwa hasilnya sesuai dengan yang kita harapkan.

Text Localization and Detection

Dengan Tesseract, kita juga bisa melakukan localization dan pendeteksian teks dari gambar. Mari kita mulai. Pertama-tama kita akan memasukkan dependensi yang kita butuhkan.

from pytesseract import Output
import pytesseract
import cv2

Saya akan menggunakan gambar seperti contoh sebelumnya.

Mari kita load data dan ekstrak data tersebut.

filename = 'image_01.png'
image = cv2.imread(filename)

Berbeda dengan yang kita lakukan pada contoh sebelumnya, dimana pada contoh sebelumnya kita langsung mengubah gambar menjadi string. Pada contoh ini, kita akan mengonversi gambar menjadi suatu dictionary.

results = pytesseract.image_to_data(image, output_type=Output.DICT)

Hasil berikut adalah isi dari dictionary tersebut.

{
'level': [1, 2, 3, 4, 5, 5, 5],
'page_num': [1, 1, 1, 1, 1, 1, 1],
'block_num': [0, 1, 1, 1, 1, 1, 1],
'par_num': [0, 0, 1, 1, 1, 1, 1],
'line_num': [0, 0, 0, 1, 1, 1, 1],
'word_num': [0, 0, 0, 0, 1, 2, 3],
'left': [0, 26, 26, 26, 26, 110, 216],
'top': [0, 63, 63, 63, 63, 63, 63],
'width': [300, 249, 249, 249, 77, 100, 59],
'height': [150, 25, 25, 25, 25, 19, 19],
'conf': ['-1', '-1', '-1', '-1', 97, 96, 96],
'text': ['', '', '', '', 'Testing', 'Tesseract', 'OCR']
}

Saya tidak akan menjelaskan satu persatu maksud dari setiap nilai dalam dictionary. Di sini kita akan menggunakan left, top, width, dan height untuk menggambar kotak pembatas di sekitar teks bersama dengan teks itu sendiri. Selain itu, kita memerlukan kunci conf untuk menentukan batas teks yang terdeteksi.

Sekarang kita akan mengekstrak koordinat kotak pembatas dari wilayah teks dari hasil saat ini dan kita menentukan nilai confidence yang kita inginkan, di sini saya akan menggunakan nilai conf = 70. Jadi kodenya akan seperti ini.

for i in range(0, len(results[“text”])):
x = results["left"][i]
y = results["top"][i]

w = results["width"][i]
h = results["height"][i]
text = results["text"][i]
conf = int(results["conf"][i])
if conf > 70:
text = "".join([c if ord(c) < 128 else "" for c in text]).strip()
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 200), 2)

Sekarang semuanya sudah diatur. Kemudian kita tampilkan hasilnya menggunakan kode ini.

cv2.imshow(image)

Dan inilah hasilnya.

Kesimpulan yang dapat diperoleh adalah tesseract paling cocok saat membangun pemrosesan dokumen gambar yang sudah diproses. Ini bekerja paling baik untuk situasi dengan input resolusi tinggi di mana teks latar depan tersegmentasi dengan rapi dari latar belakang.

Untuk pelokalan dan deteksi teks, ada beberapa parameter yang bisa kita ubah, seperti batas nilai confidence. Kita juga dapat mengubah ketebalan atau warna kotak pembatas atau teks.

--

--