0Pricing
AI Agents · Pelajaran

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 deskew

Opsi 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

  1. Mengurai PDF dengan PyMuPDF dan pdfplumber
  2. OCR untuk Dokumen Hasil Pemindaian
  3. Agen Tanya Jawab Multidokumen
  4. Klasifikasi dan Perutean Dokumen
← Kembali ke AI Agents