OCR untuk Dokumen Imbasan
Tesseract melalui pytesseract, prapemprosesan imej dan peningkatan ketepatan.
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 deskewPilihan 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.
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
- Menghuraikan PDF dengan PyMuPDF dan pdfplumber
- OCR untuk Dokumen Imbasan
- Ejen Soal Jawab Berbilang Dokumen
- Pengelasan dan Penghalaan Dokumen