0Pricing
AI Agents · درس

OCR للمستندات الممسوحة ضوئيًا

استخدام Tesseract عبر pytesseract، ومعالجة الصور مسبقًا، وتحسين الدقة

OCR للمستندات الممسوحة ضوئيًا درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

متى تكون تقنية OCR ضرورية

ليست كل المستندات ملفات PDF منشأة رقميًا. فالمستندات الممسوحة ضوئيًا، وصور النصوص، والملاحظات المكتوبة بخط اليد، وملفات PDF المعتمدة على الصور تتطلب التعرّف الضوئي على الحروف (OCR) لاستخراج النص.

تحوّل تقنية OCR الصور البكسلية للنصوص إلى محارف قابلة للقراءة آليًا. ومن أبرز مكتبات Python: pytesseract (Google Tesseract) وEasyOCR (يعتمد على التعلم العميق ويدعم لغات متعددة).

أساسيات pytesseract

‏pytesseract هو غلاف Python لمحرك OCR ‏Tesseract من Google. ثبّت Tesseract أولًا على مستوى نظام التشغيل، ثم نفّذ 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}')

المعالجة المسبقة للصور: التدرج الرمادي

تعتمد دقة OCR بدرجة كبيرة على جودة الصورة. تتمثل الخطوة الأولى في المعالجة المسبقة في تحويل الصورة إلى تدرج رمادي؛ إذ يضيف اللون ضوضاءً من دون أن يساعد في التعرّف على المحارف.

استخدم Pillow أو OpenCV للمعالجة المسبقة. يقلل التدرج الرمادي الضوضاء ويحسّن قدرة 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])

المعالجة المسبقة للصور: تطبيق العتبة

يحوّل تطبيق العتبة الصورة ذات التدرج الرمادي إلى صورة بالأبيض والأسود الخالص. ويزيل ذلك الظلال الرمادية والإضاءة غير المتساوية وضوضاء الخلفية، مما يجعل النص بارزًا بوضوح أمام 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])

المعالجة المسبقة للصور: تصحيح الانحراف

غالبًا ما تكون المستندات الممسوحة ضوئيًا مائلة قليلًا. وحتى الميل بمقدار درجتين يمكن أن يقلل دقة OCR بدرجة ملحوظة. يكتشف تصحيح الانحراف زاوية الدوران ويصححها قبل تمرير الصورة إلى محرك 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

خيارات اللغات في Tesseract

يدعم Tesseract أكثر من 100 لغة. نزّل حزم اللغات باستخدام مدير حزم نظام التشغيل. وبالنسبة إلى المستندات متعددة اللغات، حدّد عدة لغات باستخدام الفاصل +.

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: يعتمد على التعلم العميق

يستخدم EasyOCR نماذج التعلم العميق، ويتفوق على Tesseract في الصور منخفضة الجودة والنصوص المنحنية والكتابات غير اللاتينية. ولا يتطلب تثبيتًا على مستوى نظام التشغيل.

ثبّته باستخدام pip install easyocr. ويؤدي التشغيل الأول إلى تنزيل أوزان النموذج التي يبلغ حجمها نحو 200 ميجابايت.

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 مع المستندات متعددة اللغات

يتعامل EasyOCR جيدًا مع المستندات التي تجمع بين لغات متعددة، وهو مفيد للعقود الدولية، والأبحاث التي تحتوي على تسميات توضيحية بلغات متعددة، أو المستندات التي تتضمن مصطلحات تقنية مكتوبة بنظام كتابة مختلف.

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
    ]

مسار المعالجة المسبقة الكامل

اجمع جميع خطوات المعالجة المسبقة، أي التحويل إلى التدرج الرمادي وتطبيق العتبة وتصحيح الانحراف، في دالة واحدة لمسار المعالجة. شغّل OCR على الصورة المنقّاة وأعد النص ومقاييس الثقة معًا.

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

التعامل مع ملفات PDF المعتمدة على الصور

تحتوي بعض ملفات PDF على صفحات ممسوحة ضوئيًا مخزنة كصور داخل حاوية PDF. اكتشف هذه «ملفات PDF المصوّرة» وطبّق OCR على كل صفحة باستخدام PyMuPDF لاستخراج الصور أولًا.

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)

تصفية الثقة والمعالجة اللاحقة

يحتوي ناتج OCR على أخطاء، لا سيما في الصور منخفضة الجودة. عالج النص لاحقًا من خلال تصفية الكلمات منخفضة الثقة، وتصحيح أخطاء OCR الشائعة مثل الخلط بين 0 وO أو بين 1 وl، وتوحيد المسافات البيضاء.

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

اختبار المعرفة

ما الغرض من تطبيق العتبة (التحويل إلى صورة ثنائية) على صورة قبل إجراء OCR؟

مراجعة: تقنية OCR للمستندات الممسوحة ضوئيًا

تحوّل تقنية OCR الصور الممسوحة ضوئيًا إلى نص قابل للقراءة آليًا. وتغلّف pytesseract محرك Google Tesseract، وهو سريع وناضج ويدعم أكثر من 100 حزمة لغوية. أما EasyOCR فيستخدم التعلم العميق ويتعامل مع الصور منخفضة الجودة والنصوص متعددة اللغات بصورة أفضل.

احرص دائمًا على المعالجة المسبقة: حوّل الصورة إلى تدرج رمادي، وطبّق عتبة Otsu للتحويل إلى صورة ثنائية، وصحّح الانحراف لتعديل الدوران. وبالنسبة إلى ملفات PDF المعتمدة على الصور، اعرض الصفحات كصور عالية الدقة باستخدام PyMuPDF ثم شغّل OCR. صفِّ النتائج باستخدام حد للثقة لاستبعاد الضوضاء.

الأسئلة الشائعة

هل درس «OCR للمستندات الممسوحة ضوئيًا» مجاني؟

نعم — نص درس «OCR للمستندات الممسوحة ضوئيًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «OCR للمستندات الممسوحة ضوئيًا»؟

استخدام Tesseract عبر pytesseract، ومعالجة الصور مسبقًا، وتحسين الدقة تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «OCR للمستندات الممسوحة ضوئيًا»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تحليل PDF باستخدام PyMuPDF وpdfplumber
  2. OCR للمستندات الممسوحة ضوئيًا
  3. وكلاء الأسئلة والأجوبة عبر مستندات متعددة
  4. تصنيف المستندات وتوجيهها
← العودة إلى AI Agents