OCR untuk Dokumen Hasil Pemindaian
Tesseract melalui pytesseract, prapemrosesan gambar, dan peningkatan akurasi.
OCR untuk Dokumen Hasil Pemindaian adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Saat OCR Diperlukan
Tidak semua dokumen merupakan PDF digital asli. Dokumen pindaian, foto teks, catatan tulisan tangan, dan PDF berbasis gambar memerlukan Pengenalan Karakter Optik (OCR) untuk mengekstrak teks.
OCR mengubah gambar piksel berisi teks menjadi karakter yang dapat dibaca mesin. Dua pustaka Python terkemuka adalah pytesseract (Google Tesseract) dan EasyOCR (pembelajaran mendalam, multibahasa).
Dasar-Dasar pytesseract
pytesseract adalah pembungkus Python untuk mesin OCR Tesseract milik Google. Pasang Tesseract terlebih dahulu pada tingkat OS, lalu jalankan pip install pytesseract Pillow.
import pytesseract
from PIL import Image
# Simple text extraction
image = Image.open('scanned_document.png')
text = pytesseract.image_to_string(image)
print(text)
# Specify language (default: English)
text_fr = pytesseract.image_to_string(
Image.open('french_doc.png'),
lang='fra'
)
# Get detailed output with bounding boxes
data = pytesseract.image_to_data(
image,
output_type=pytesseract.Output.DICT
)
for i, word in enumerate(data['text']):
if word.strip():
conf = data['conf'][i]
print(f'Word: {word!r:20} Confidence: {conf}')Pra-pemrosesan Gambar: Skala Abu-Abu
Akurasi OCR sangat bergantung pada kualitas gambar. Langkah pertama pra-pemrosesan adalah mengubah gambar ke skala abu-abu — warna menambah gangguan tanpa membantu pengenalan karakter.
Gunakan Pillow atau OpenCV untuk pra-pemrosesan. Skala abu-abu mengurangi gangguan dan meningkatkan deteksi batas karakter oleh Tesseract.
from PIL import Image, ImageOps
import numpy as np
def preprocess_grayscale(image_path):
img = Image.open(image_path)
# Convert to grayscale
img = img.convert('L') # 'L' = 8-bit grayscale
# Optionally resize for better OCR (Tesseract works best at ~300 DPI)
# Scale up small images
width, height = img.size
if width < 800:
scale = 800 / width
new_size = (int(width * scale), int(height * scale))
img = img.resize(new_size, Image.LANCZOS)
return img
img = preprocess_grayscale('scan.jpg')
text = pytesseract.image_to_string(img)
print(text[:300])Pra-pemrosesan Gambar: Penerapan Ambang Batas
Penerapan ambang batas mengubah gambar skala abu-abu menjadi hitam-putih murni. Proses ini menghilangkan bayangan abu-abu, pencahayaan yang tidak merata, dan gangguan latar belakang — sehingga teks tampak jelas untuk OCR.
from PIL import Image, ImageFilter
import numpy as np
def apply_threshold(img):
# Method 1: Simple fixed threshold
img_array = np.array(img)
threshold = 128
binary = np.where(img_array > threshold, 255, 0).astype(np.uint8)
return Image.fromarray(binary)
def adaptive_threshold(img):
# Method 2: Otsu's method via OpenCV (better for uneven lighting)
try:
import cv2
img_array = np.array(img)
_, binary = cv2.threshold(
img_array, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
return Image.fromarray(binary)
except ImportError:
return apply_threshold(img)
img = preprocess_grayscale('uneven_scan.png')
img_clean = adaptive_threshold(img)
text = pytesseract.image_to_string(img_clean)
print(text[:300])Pra-pemrosesan Gambar: Pelurusan Kemiringan
Dokumen pindaian sering kali sedikit miring. Kemiringan bahkan sebesar 2 derajat dapat mengurangi akurasi OCR secara signifikan. Pelurusan kemiringan mendeteksi dan memperbaiki sudut rotasi sebelum gambar diteruskan ke mesin OCR.
import numpy as np
from PIL import Image
def deskew(img):
try:
import cv2
img_array = np.array(img)
# Find rotation angle using Hough line transform
edges = cv2.Canny(img_array, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
if lines is None:
return img # no lines detected, return unchanged
angles = []
for line in lines:
rho, theta = line[0]
angle = np.degrees(theta) - 90
if -45 < angle < 45:
angles.append(angle)
if not angles:
return img
median_angle = np.median(angles)
if abs(median_angle) > 0.5: # only deskew if significant tilt
print(f'Deskewing by {median_angle:.2f} degrees')
return img.rotate(-median_angle, expand=True, fillcolor=255)
return img
except ImportError:
return img # OpenCV not available — skip deskewOpsi Bahasa Tesseract
Tesseract mendukung lebih dari 100 bahasa. Unduh paket bahasa menggunakan pengelola paket OS Anda. Untuk dokumen multibahasa, tentukan beberapa bahasa dengan pemisah +.
import pytesseract
from PIL import Image
# List available languages
import subprocess
result = subprocess.run(['tesseract', '--list-langs'], capture_output=True, text=True)
print('Available languages:')
print(result.stdout)
# Single language
text_en = pytesseract.image_to_string(Image.open('doc.png'), lang='eng')
# Multiple languages (auto-detect best match)
text_multi = pytesseract.image_to_string(
Image.open('doc.png'),
lang='eng+fra+deu' # English + French + German
)
# Tesseract config options for better accuracy
custom_config = r'--oem 3 --psm 6' # OEM 3=LSTM, PSM 6=assume uniform block of text
text_tuned = pytesseract.image_to_string(
Image.open('doc.png'),
config=custom_config
)EasyOCR Berbasis Pembelajaran Mendalam
EasyOCR menggunakan model pembelajaran mendalam dan mengungguli Tesseract pada gambar yang rusak, teks melengkung, dan aksara non-Latin. EasyOCR tidak memerlukan instalasi pada tingkat OS.
Pasang dengan pip install easyocr. Proses pertama akan mengunduh bobot model (sekitar 200 MB).
import easyocr
# Initialize reader (downloads model on first run)
reader = easyocr.Reader(
['en', 'tr'], # list of languages
gpu=False # set True if CUDA available
)
# Read text from image
results = reader.readtext('scanned_page.png')
for (bbox, text, confidence) in results:
print(f'Text: {text!r:30} Confidence: {confidence:.2f}')
# bbox = [[x1,y1],[x2,y2],[x3,y3],[x4,y4]] (four corners)
# Get plain text only
text_only = ' '.join(result[1] for result in results)
print('Full text:', text_only[:300])EasyOCR untuk Dokumen Multibahasa
EasyOCR menangani dokumen dengan bahasa campuran dengan baik — berguna untuk kontrak internasional, makalah penelitian dengan keterangan dalam beberapa bahasa, atau dokumen dengan istilah teknis dalam aksara yang berbeda.
import easyocr
# For Arabic-English mixed document
reader_ar = easyocr.Reader(['ar', 'en'], gpu=False)
results = reader_ar.readtext('arabic_contract.png')
# For CJK languages
reader_cjk = easyocr.Reader(['ch_sim', 'en'], gpu=False) # Simplified Chinese + English
results_cjk = reader_cjk.readtext('chinese_report.png')
# Filter by confidence threshold
HIGH_CONFIDENCE = 0.7
def filter_confident_results(results, threshold=HIGH_CONFIDENCE):
return [
(bbox, text, conf)
for bbox, text, conf in results
if conf >= threshold
]Alur Pemrosesan Pra-pemrosesan Lengkap
Rangkai semua langkah pra-pemrosesan — skala abu-abu, ambang batas, dan pelurusan kemiringan — ke dalam satu fungsi alur pemrosesan. Jalankan OCR pada gambar yang telah dibersihkan, lalu kembalikan teks dan metrik tingkat keyakinan.
import pytesseract
from PIL import Image
def ocr_pipeline(image_path, lang='eng', engine='tesseract'):
print(f'Processing: {image_path}')
# 1. Load
img = Image.open(image_path)
# 2. Preprocess
img = img.convert('L') # grayscale
img = adaptive_threshold(img) # binarize
img = deskew(img) # correct rotation
# 3. OCR
if engine == 'easyocr':
reader = easyocr.Reader([lang], gpu=False)
results = reader.readtext(image_path)
text = ' '.join(r[1] for r in results if r[2] > 0.5)
else:
config = f'--oem 3 --psm 6 -l {lang}'
text = pytesseract.image_to_string(img, config=config)
# 4. Clean
text = '\n'.join(
line.strip() for line in text.splitlines()
if line.strip()
)
return text
text = ocr_pipeline('invoice_scan.jpg')
print(text[:500])Menangani PDF Berbasis Gambar
Beberapa PDF berisi halaman pindaian yang disimpan sebagai gambar di dalam wadah PDF. Deteksi PDF gambar tersebut dan terapkan OCR per halaman dengan menggunakan PyMuPDF untuk mengekstrak gambar terlebih dahulu.
import fitz
from PIL import Image
import io
import pytesseract
def is_image_pdf(doc):
# Check if first page has very little extractable text
text = doc[0].get_text().strip()
return len(text) < 50
def ocr_pdf(filepath):
doc = fitz.open(filepath)
if not is_image_pdf(doc):
# Native text — no OCR needed
return '\n'.join(doc[i].get_text() for i in range(len(doc)))
print('Image PDF detected — running OCR')
all_text = []
for page_num in range(len(doc)):
page = doc[page_num]
# Render page as image at 300 DPI
mat = fitz.Matrix(300/72, 300/72) # scale to 300 DPI
pix = page.get_pixmap(matrix=mat)
img = Image.open(io.BytesIO(pix.tobytes('png')))
text = pytesseract.image_to_string(img)
all_text.append(f'--- Page {page_num+1} ---\n{text}')
doc.close()
return '\n'.join(all_text)Penyaringan Berdasarkan Tingkat Keyakinan dan Pascapemrosesan
Keluaran OCR mengandung kesalahan, terutama pada gambar yang rusak. Lakukan pascapemrosesan teks dengan menyaring kata bertingkat keyakinan rendah, memperbaiki kesalahan OCR yang umum (0 dan O, 1 dan l), serta menormalkan spasi.
import re
COMMON_OCR_ERRORS = {
r'\b0([a-z])\b': r'O\1',
r'\bl([0-9])\b': r'1\1',
r'\|': 'I',
r' +': ' ',
}
def post_process_ocr(text):
for pattern, replacement in COMMON_OCR_ERRORS.items():
text = re.sub(pattern, replacement, text)
lines = [line.strip() for line in text.splitlines()]
return '\n'.join(line for line in lines if line)
def high_confidence_ocr(words_with_conf, min_confidence=60):
words = [w for w, conf in words_with_conf if w.strip() and conf >= min_confidence]
return post_process_ocr(' '.join(words))
fake_ocr_output = [('0range', 90), ('|s', 40), ('l5', 85), ('good', 95)]
print(high_confidence_ocr(fake_ocr_output))Pemeriksaan Pengetahuan
Apa tujuan menerapkan ambang batas (binarisasi) pada gambar sebelum OCR?
Rangkuman: OCR untuk Dokumen Pindaian
OCR mengubah gambar pindaian menjadi teks yang dapat dibaca mesin. pytesseract membungkus Google Tesseract — cepat dan matang, dengan lebih dari 100 paket bahasa. EasyOCR menggunakan pembelajaran mendalam dan lebih baik dalam menangani gambar yang rusak serta teks multibahasa.
Selalu lakukan pra-pemrosesan: ubah gambar ke skala abu-abu, terapkan ambang batas Otsu untuk binarisasi, dan luruskan kemiringan untuk memperbaiki rotasi. Untuk PDF berbasis gambar, ubah halaman menjadi gambar dengan DPI tinggi menggunakan PyMuPDF, lalu jalankan OCR. Saring hasil berdasarkan ambang batas tingkat keyakinan untuk mengecualikan gangguan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “OCR untuk Dokumen Hasil Pemindaian” gratis?
Ya — teks lengkap “OCR untuk Dokumen Hasil Pemindaian” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “OCR untuk Dokumen Hasil Pemindaian”?
Tesseract melalui pytesseract, prapemrosesan gambar, dan peningkatan akurasi. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “OCR untuk Dokumen Hasil Pemindaian” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengurai PDF dengan PyMuPDF dan pdfplumber
- OCR untuk Dokumen Hasil Pemindaian
- Agen Tanya Jawab Multidokumen
- Klasifikasi dan Perutean Dokumen