Ejen AI · Pelajaran

OCR untuk Dokumen Imbasan

Tesseract melalui pytesseract, prapemprosesan imej dan peningkatan ketepatan.

Pelajaran 2 daripada 413 langkah

OCR untuk Dokumen Imbasan ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Apabila OCR Diperlukan

Tidak semua dokumen ialah PDF asli digital. Dokumen yang diimbas, gambar teks, nota tulisan tangan dan PDF berasaskan imej memerlukan Pengecaman Aksara Optik (OCR) untuk mengekstrak teks.

OCR menukarkan imej piksel teks kepada aksara yang boleh dibaca oleh mesin. Dua pustaka Python utama ialah pytesseract (Google Tesseract) dan EasyOCR (pembelajaran mendalam, berbilang bahasa).

Asas pytesseract

pytesseract ialah pembungkus Python untuk enjin OCR Tesseract milik Google. Pasang Tesseract terlebih dahulu pada peringkat OS, kemudian 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}')

Prapemprosesan Imej: Skala Kelabu

Ketepatan OCR sangat bergantung pada kualiti imej. Langkah prapemprosesan pertama ialah menukarkan imej kepada skala kelabu — warna menambah hingar tanpa membantu pengecaman aksara.

Gunakan Pillow atau OpenCV untuk prapemprosesan. Skala kelabu mengurangkan hingar dan meningkatkan pengesanan sempadan aksara 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])

Prapemprosesan Imej: Pengenangan Ambang

Pengenangan ambang menukarkan imej skala kelabu kepada hitam dan putih tulen. Langkah ini menghilangkan bayang kelabu, pencahayaan tidak sekata dan hingar latar belakang — lalu menjadikan teks lebih 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])

Prapemprosesan Imej: Pembetulan Kecondongan

Dokumen yang diimbas sering sedikit berpusing. Kecondongan walaupun 2 darjah boleh mengurangkan ketepatan OCR dengan ketara. Pembetulan kecondongan mengesan dan membetulkan sudut putaran sebelum imej dihantar kepada enjin 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

Pilihan Bahasa Tesseract

Tesseract menyokong lebih daripada 100 bahasa. Muat turun pek bahasa menggunakan pengurus pakej OS anda. Untuk dokumen berbilang bahasa, 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: Berasaskan Pembelajaran Mendalam

EasyOCR menggunakan model pembelajaran mendalam dan mengatasi Tesseract pada imej yang rosak, teks melengkung dan skrip bukan Latin. Ia tidak memerlukan pemasangan pada peringkat OS.

Pasang dengan pip install easyocr. Pada kali pertama dijalankan, pemberat model akan dimuat turun (~200MB).

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 Berbilang Bahasa

EasyOCR mengendalikan dokumen berbahasa campuran dengan baik — berguna untuk kontrak antarabangsa, kertas penyelidikan dengan kapsyen dalam beberapa bahasa atau dokumen yang mengandungi istilah teknikal dalam skrip yang berbeza.

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
    ]

Saluran Prapemprosesan Lengkap

Rangkaikan semua langkah prapemprosesan — skala kelabu, ambang dan pembetulan kecondongan — ke dalam satu fungsi saluran. Jalankan OCR pada imej yang telah dibersihkan dan kembalikan kedua-dua teks serta metrik 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])

Mengendalikan PDF Berasaskan Imej

Sesetengah PDF mengandungi halaman yang diimbas dan disimpan sebagai imej di dalam bekas PDF. Kesan 'PDF imej' ini dan gunakan OCR pada setiap halaman dengan PyMuPDF untuk mengekstrak imej 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)

Penapisan Keyakinan dan Pascapemprosesan

Output OCR mengandungi ralat, terutamanya pada imej yang rosak. Pascaproseskan teks dengan menapis perkataan yang mempunyai keyakinan rendah, membetulkan kesilapan OCR yang biasa (0 berbanding O, 1 berbanding l) dan menyeragamkan ruang kosong.

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))

Semakan Pengetahuan

Apakah tujuan menggunakan ambang (penduaan) pada imej sebelum OCR?

Imbas Kembali: OCR untuk Dokumen yang Diimbas

OCR menukarkan imej yang diimbas kepada teks yang boleh dibaca oleh mesin. pytesseract membungkus Google Tesseract — pantas dan matang dengan lebih daripada 100 pek bahasa. EasyOCR menggunakan pembelajaran mendalam dan mengendalikan imej yang rosak serta teks berbilang bahasa dengan lebih baik.

Sentiasa lakukan prapemprosesan: tukarkan kepada skala kelabu, gunakan pengenangan ambang Otsu untuk penduaan dan betulkan kecondongan bagi membetulkan putaran. Untuk PDF berasaskan imej, paparkan halaman sebagai imej dengan DPI tinggi menggunakan PyMuPDF, kemudian jalankan OCR. Tapis hasil berdasarkan ambang keyakinan untuk mengecualikan hingar.

Percuma untuk bermula

Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
60
Pelajaran
239

Soalan Lazim

Adakah pelajaran “OCR untuk Dokumen Imbasan” percuma?

Ya — teks penuh “OCR untuk Dokumen Imbasan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “OCR untuk Dokumen Imbasan”?

Tesseract melalui pytesseract, prapemprosesan imej dan peningkatan ketepatan. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “OCR untuk Dokumen Imbasan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?

Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menghuraikan PDF dengan PyMuPDF dan pdfplumber
  2. OCR untuk Dokumen Imbasan
  3. Ejen Soal Jawab Berbilang Dokumen
  4. Pengelasan dan Penghalaan Dokumen
← Kembali ke Ejen AI