Mendapatkan bounding box di sekitar teks pada image
Deskripsi
Saat menjalankan gambar melalui mesin Tesseract OCR, pytesseract memungkinkan pengguna untuk memperoleh informasi bounding box pada:
Tingkat karakter,
Tingkat kata,
Berdasarkan pola regex.
Pada praktikum ini, akan dijelaskan cara memperoleh kedua jenis informasi tersebut.
Bounding Box - Level Karakter
Dengan menggunakan Pytesseract, Anda dapat memperoleh informasi bounding box untuk hasil OCR dengan menggunakan kode berikut.
Skrip di bawah ini akan memberikan informasi bounding box untuk setiap karakter yang terdeteksi oleh tesseract selama proses OCR.
# Plot gambar original# Membaca gambar dari direktoriimage = cv2.imread(IMG_DIR +'invoice-sample.jpg')# Memisahkan saluran warna (blue, green, red) karena matplotlib menggunakan skema warna RGBb, g, r = cv2.split(image)rgb_img = cv2.merge([r, g, b])# Menampilkan gambar dalam ukuran tertentuplt.figure(figsize=(16, 12))plt.imshow(rgb_img)plt.title('CONTOH GAMBAR INVOICE')plt.show()
Langkah selanjutnya adalah, Plot karakter boxes pada gambar menggunakan fungsi pytesseract.image_to_boxes()
kode program berikut akan memberikan hasil bounding box pada image invoice
# Membaca gambar dari direktoriimage = cv2.imread(IMG_DIR +'invoice-sample.jpg')# Mendapatkan dimensi tinggi (h), lebar (w), dan channel warna (c) dari gambarh, w, c = image.shape# Menggunakan pytesseract.image_to_boxes() untuk mendapatkan informasi kotak karakterboxes = pytesseract.image_to_boxes(image)# Iterasi melalui setiap baris hasil dan membuat kotak pada gambar menggunakan OpenCVfor b in boxes.splitlines(): b = b.split(' ') image = cv2.rectangle(image, (int(b[1]), h -int(b[2])), (int(b[3]), h -int(b[4])), (0, 255, 0), 2)# Memisahkan channel warna untuk mengonversi dari BGR ke RGBb, g, r = cv2.split(image)rgb_img = cv2.merge([r, g, b])# Menampilkan gambar dengan kotak karakterplt.figure(figsize=(16, 12))plt.imshow(rgb_img)plt.title('CONTOH INVOICE DENGAN CHARACTER LEVEL BOXES')plt.show()
Bounding Box - Level Kata
langkah Selanjutnya kita akan menggunakan gambar contoh invoice di atas untuk menguji hasil output dari Tesseract.
Pada Code berikut akan digunakan untuk membaca gambar contoh invoice, kemudian menggunakan fungsi pytesseract.image_to_data() untuk mendapatkan data teks dari gambar.
# Membaca gambar contoh invoiceimage = cv2.imread(IMG_DIR +'invoice-sample.jpg')# Menggunakan pytesseract.image_to_data() untuk mendapatkan data teks dari gambard = pytesseract.image_to_data(image, output_type=Output.DICT)# Menampilkan kunci-kunci data yang diperoleh dari hasil OCRprint('DATA KEYS: \n', d.keys())
Hasil yang didapatkan seharusnya memberikan output sebagai berikut:
Selanjutnya pada code berikut digunakan untuk memfilter dan hanya menampilkan kotak-kotak kata yang memiliki tingkat kepercayaan (confidence) lebih dari 60%. Hasilnya, gambar contoh invoice akan ditampilkan dengan kotak-kotak yang menandai lokasi setiap kata dengan tingkat kepercayaan yang memenuhi syarat.
n_boxes =len(d['text'])for i inrange(n_boxes):# Kondisi untuk hanya memilih kotak dengan kepercayaan > 60%ifint(d['conf'][i])>60:# Mendapatkan koordinat dan ukuran kotak kata (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])# Membuat kotak pada gambar untuk kata dengan kepercayaan > 60% image = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# Memisahkan channel warna untuk mengonversi dari BGR ke RGBb, g, r = cv2.split(image)rgb_img = cv2.merge([r, g, b])# Menampilkan gambar dengan kotak kata berdasarkan kepercayaan > 60%plt.figure(figsize=(16, 12))plt.imshow(rgb_img)plt.title('CONTOH INVOICE DENGAN KOTAK KATA LEVEL')plt.show()
Text template matching - Pola Regex
Misalkan kita ingin menemukan di mana suatu tanggal berada dalam sebuah gambar. Di sini, template yang kita akan gunakan berupa pola ekspresi reguler yang akan kita cocokkan dengan hasil OCR kita untuk menemukan kotak-kotak pembatas yang sesuai. Kita akan menggunakan modul regex dan fungsi image_to_data untuk hal ini.
image = cv2.imread(IMG_DIR +'invoice-sample.jpg')# Pola tanggal dalam format dd/mm/yyyydate_pattern ='^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d$'n_boxes =len(d['text'])for i inrange(n_boxes):# Memeriksa apakah kotak memiliki tingkat kepercayaan lebih dari 60%ifint(d['conf'][i])>60:# Memeriksa apakah teks di dalam kotak sesuai dengan pola tanggalif re.match(date_pattern, d['text'][i]):# Mendapatkan koordinat dan ukuran kotak kata (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])# Membuat kotak pada gambar untuk tanggal yang sesuai dengan pola image = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# Memisahkan channel warna untuk mengonversi dari BGR ke RGBb, g, r = cv2.split(image)rgb_img = cv2.merge([r, g, b])# Menampilkan gambar dengan kotak-kotak yang menandai lokasi tanggalplt.figure(figsize=(16, 12))plt.imshow(rgb_img)plt.title('CONTOH INVOICE DENGAN KOTAK UNTUK TANGGAL')plt.show()
Deteksi berbagai bahasa - OCR
Anda dapat memeriksa bahasa yang tersedia dan didukung dalam tesseract pada taupan berikut
Tesseract memiliki dukungan unicode (UTF-8), dan dapat mengenali lebih dari 100 bahasa secara langsung.
Untuk menetapkan bahasa yang diinginkan untuk hasil OCR Anda, gunakan argumen -l LANG dalam konfigurasi di mana LANG adalah kode tiga huruf untuk bahasa yang ingin Anda gunakan.
Kode berikut digunakan untuk membaca dan menampilkan gambar yang berisi teks dalam beberapa bahasa. Gambar asli ditampilkan untuk memberikan gambaran tentang kontennya sebelum proses OCR.
# Membaca gambar asliimage = cv2.imread(IMG_DIR +'greek-thai.png')# Memisahkan channel warna untuk mengonversi dari BGR ke RGBb, g, r = cv2.split(image)rgb_img = cv2.merge([r, g, b])# Menampilkan gambar asliplt.figure(figsize=(8, 16))plt.imshow(rgb_img, cmap='gray')plt.title('MULTIPLE LANGUAGE IMAGE')plt.show()
Selanjutnya, Kode berikut digunakan untuk mengekstrak teks dari gambar dengan menggunakan Tesseract OCR. Konfigurasi khusus (custom_config) diterapkan dengan hanya menentukan bahasa Inggris (-l eng). Parameter lain seperti --oem 3 dan --psm 6 juga digunakan untuk mengoptimalkan hasil OCR sesuai kebutuhan.
# Output dengan hanya bahasa Inggris yang ditentukan# Konfigurasi khusus dengan hanya bahasa Inggris yang diaturcustom_config =r'-l eng --oem 3 --psm 6'# Menggunakan pytesseract.image_to_string() untuk mendapatkan teks dari gambar dengan konfigurasi khususprint(pytesseract.image_to_string(image, config=custom_config))
5 Greek
Here’s some Greek:
OSto Stota tuMedit Huy et, aS ea aByoppeave edAwkvevOuay, e§ ece efepot yu-
Bepypev nas. AT Wel GoAET apiTtopen. Tug aAta AaBwpe Ve. LO KUWT VUoKLaL
(paovvéia av, WUVLUU eAtyevil tv mpL TMaptep bepSepey GvaTLAaVTUp e€€ LUG, Va
TWAALT LUdaped ASdepoapluy Ea, TOW TpwTplae Gaedoda 16. AT mpt SoAop vv-
oxvau.
6 Thai
Here’s some Thai: .
aosUsugulushawos amiaddw usntioa sinfudou winszduagss Haaonsn 3 vos
Aonduusaladrawunud AavTausssulwavianlAdudn wandoamnsiwinsedataa
$ Guduvi woud rvaseasiadu Windinsadosor0sa uausouanrwus aswouduer
didadinsa