Tesseract OCR di Python
dengan pytesseract.
Panduan lengkap dan teruji untuk pytesseract: pemasangan, API inti, prapemrosesan gambar, PDF, skor keyakinan, konfigurasi PSM/OEM, performa, dan error yang paling sering terjadi.
Mulai cepat (tiga baris)
Pasang mesin terlebih dahulu, lalu jalankan ini. Penyiapan lengkap ada di bawah.
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(Image.open("image.png"))
print(text)Pasang pytesseract
pytesseract hanya pembungkus: ia memanggil biner Tesseract, jadi mesin harus dipasang lebih dulu.
pip install pytesseract pillow
# opsional, untuk prapemrosesan:
pip install opencv-python numpy
# opsional, untuk input PDF:
pip install pdf2imageJika mesin tidak ada di PATH (umum di Windows), arahkan secara eksplisit:
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"Baru dengan mesinnya? Lihat panduan pemasangan untuk Windows, macOS, Linux, Docker, dan WSL.
API inti
pytesseract menyediakan satu fungsi per jenis keluaran. Pilih sesuai kebutuhan Anda.
| Fungsi | Mengembalikan | Gunakan saat |
|---|---|---|
image_to_string | Teks biasa | Hanya butuh teks yang dikenali |
image_to_data | Kotak per kata + keyakinan | Menyorot teks, memfilter kata berkeyakinan rendah |
image_to_boxes | Kotak per karakter | Geometri tingkat karakter |
image_to_pdf_or_hocr | PDF dapat dicari atau hOCR | Membuat PDF dapat dicari atau overlay web |
image_to_osd | Deteksi orientasi dan aksara | Mendeteksi rotasi atau aksara sebelum OCR |
image_to_alto_xml | ALTO XML | Pipeline arsip / perpustakaan |
Konfigurasi: PSM, OEM, bahasa, dan daftar karakter
Berikan opsi sebagai string dipisah spasi ke config=.
# Satu blok teks, mesin LSTM, bahasa Indonesia
text = pytesseract.image_to_string(img, lang="ind", config="--oem 3 --psm 6")
# Hanya angka (total struk, bacaan meteran)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")
# Bahasa gabungan
text = pytesseract.image_to_string(img, lang="eng+ind")| PSM | Mode | Ideal untuk |
|---|---|---|
| 3 | Sepenuhnya otomatis (bawaan) | Dokumen standar |
| 4 | Satu kolom dengan ukuran bervariasi | Artikel, halaman satu kolom |
| 6 | Satu blok teks seragam | Paragraf, label |
| 7 | Satu baris teks | Keterangan satu baris, bidang tunggal |
| 8 | Satu kata | Kata individual |
| 11 | Teks jarang | Struk, teks antarmuka yang tersebar |
| 13 | Baris mentah | Satu baris tanpa trik Tesseract |
Mode OEM: --oem 1 (hanya LSTM, bawaan v5), --oem 0 (lama), --oem 3 (otomatis). Referensi lengkap di dokumentasi.
Prapemrosesan gambar
Masukan yang bersih adalah faktor terbesar dalam akurasi. Berikut langkah yang paling penting.
import cv2, numpy as np, pytesseract
from PIL import Image
image = cv2.imread("struk.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Perbesar teks kecil ke setara ~300 DPI
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# Kurangi noise, lalu ambang Otsu ke hitam-putih murni
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
text = pytesseract.image_to_string(Image.fromarray(binary))- Grayscale — hilangkan kanal warna sebelum ambang.
- Perbesaran — teks di bawah ~20 px dikenali buruk; perbesar.
- Ambang — Otsu untuk cahaya merata, adaptif untuk cahaya tidak merata.
- Pengurangan noise — blur ringan menghapus bintik yang terbaca sebagai tanda baca.
- Koreksi kemiringan — perbaiki rotasi dengan
cv2.minAreaRectsebelum OCR. - Pangkas tepi — buang tepi pindaian gelap yang mengganggu analisis tata letak.
Posisi dan skor keyakinan
Gunakan image_to_data untuk kotak per kata dan keyakinan 0–100, lalu filter noise.
from pytesseract import Output
data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
if text.strip() and float(conf) > 60: # buang noise berkeyakinan rendah
print(round(float(conf)), text)OCR PDF di Python
Tesseract bekerja dengan gambar, jadi rasterkan halaman PDF lebih dulu dengan pdf2image (memerlukan poppler).
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader
pages = convert_from_path("pindaian.pdf", dpi=300) # memerlukan poppler
writer = PdfWriter()
for page in pages:
pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("pindaian_dapat_dicari.pdf", "wb") as f:
writer.write(f)Di Windows, berikan folder bin poppler melalui poppler_path=. Untuk alur yang lebih lengkap, lihat dokumentasi format keluaran.
Performa
pytesseract memanggil CLI di setiap panggilan, jadi throughput bergantung pada cara Anda menyusunnya.
| Pendekatan | Kapan | Trade-off |
|---|---|---|
pytesseract per panggilan | Skrip dan tugas sekali jalan | Memulai proses per panggilan — lambat dalam loop |
| Kelompokkan ke TIFF multi-halaman | Banyak halaman, pengaturan sama | Satu proses untuk banyak halaman |
multiprocessing | Banyak gambar independen | Memakai semua inti CPU; lebih banyak memori |
tesserocr | Volume tinggi, dalam proses | Binding native, penyiapan lebih rumit |
Katalog error
Error berikut mencakup sebagian besar masalah pytesseract.
| Error | Penyebab | Solusi |
|---|---|---|
TesseractNotFoundError | Biner tidak terpasang atau tidak di PATH | Pasang mesin atau setel pytesseract.pytesseract.tesseract_cmd. |
(-215:Assertion failed) src.type() == CV_8UC1 | Ambang pada gambar 3 kanal | Konversi dulu dengan cv2.cvtColor(img, cv2.COLOR_BGR2GRAY). |
Error opening data file ...fra.traineddata | Paket bahasa tidak ada | Pasang bahasa atau setel TESSDATA_PREFIX. |
| Keluaran kosong | DPI rendah, PSM salah, atau tidak ada teks | Perbesar, coba --psm 6/7/11, dan prapemrosesan. |
| Sangat lambat dalam loop | Satu proses per panggilan | Kelompokkan, gunakan multiprocessing atau tesserocr. |
Mengukur akurasi
Ukur tingkat kesalahan karakter dan kata alih-alih menilai keluaran dengan mata.
import pytesseract, jiwer
from PIL import Image
hypothesis = pytesseract.image_to_string(Image.open("contoh.png"))
reference = open("contoh.gt.txt").read()
print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))Simpan sekumpulan kecil gambar representatif dengan teks acuan sebagai uji regresi dan jalankan ulang saat Anda mengubah prapemrosesan atau konfigurasi.
FAQ Python
Bagaimana cara menggunakan Tesseract OCR di Python?
Pasang mesin terlebih dahulu, lalu pip install pytesseract pillow. Buka gambar dengan Pillow dan panggil pytesseract.image_to_string(img).
Mengapa muncul TesseractNotFoundError?
pytesseract tidak menemukan biner. Pasang mesin, masukkan ke PATH, atau setel pytesseract.pytesseract.tesseract_cmd ke jalur lengkap.
Bagaimana meningkatkan akurasi?
Skalakan ke ~300 DPI, grayscale, ambang, pengurangan noise, koreksi kemiringan, dan --psm yang tepat. Gunakan lang= yang sesuai dan, untuk bidang tetap, daftar karakter yang diizinkan.
Bagaimana melakukan OCR pada PDF?
Gunakan pdf2image (dengan poppler) untuk mengubah halaman menjadi gambar, jalankan pytesseract pada tiap halaman, dan gabungkan dengan image_to_pdf_or_hocr(..., extension="pdf").
Bagaimana mendapatkan skor keyakinan?
Gunakan image_to_data(..., output_type=Output.DICT) dan filter daftar conf.
Apakah pytesseract lambat?
Setiap panggilan memulai proses. Kelompokkan, gunakan multiprocessing, atau beralih ke binding dalam proses tesserocr.
Langkah berikutnya
Pelajari mesin dan ekosistem lebih dalam.