في كثير من الأحيان يفوز الفحص الضعيف والصور الهاتفية والفاكسات ومقاطع الشاشة المضغوطة OCR.الأخبار الجيدة: المعالجة المسبقة قليلة تسير طويلا.هذا الدليل يمنحك خطوات ممارسة، قابلة للتحرك (مرتبطة بالشريط في النهاية) لتنظيف الصور **قبل **OCR و تجهيز محرك OCR للحصول على نتائج أفضل بكثير.

نموذج كامل

المتطلبات

  • نيت 8 (أو .NET 6+) SDK
  • نوتردام : Aspose.OCR
  • (اختياري ) Aspose.Total.lic إذا كنت تخطط لتجاوز حدود التقييم

قم بإنشاء تطبيق لوحة المفاتيح وإضافة الحزمة:

dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR

الخطوة 1 - معالجة الصور منخفضة الجودة

الهدف: تقليل الضوضاء، وتطبيع التباين/الضوء، و (اختياريًا) ارتفاع أو زراعة قبل OCR.

1.1 تحميل الصورة

using System;
using System.Drawing;
using System.IO;

// Step 1: Load the low-quality image
string imagePath = "low_quality_image.png";
if (!File.Exists(imagePath))
    throw new FileNotFoundException(imagePath);

Bitmap image = (Bitmap)Image.FromFile(imagePath);

// Optional: quick sanity check
Console.WriteLine($"Loaded {imagePath} ({image.Width}x{image.Height}px)");

1.2 إزالة الضوضاء (الفلتر المتوسط)

استخدم مرشحًا *متوسط * لتخفيف ضوضاء الملح والفلفل والمواد JPEG.

using Aspose.Ocr.ImageProcessing;

// Median filter: try odd sizes 3, 5 (larger = stronger, but may blur small text)
var filterOptions = new FilterOptions
{
    MedianFilter = true,
    MedianFilterSize = 3
};
  • عند التغيير :*
  • إذا كنت لا تزال ترى المرآة، رفع MedianFilterSize إلى * 5 * .
  • إذا اختفت الأحرف الصغيرة، قم بالعودة إلى 3 أو قم بإيقاف تشغيله.

1.3 تطبيع التباين / الضوء

جعل النص يظهر من الخلفية.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};

** قواعد التوم :**

  • مبالغة (غسل): يقلل من الضوء (على سبيل المثال، -10) ويحافظ على تناقض معتدل.
  • غير معلقة (مظلمة للغاية): زيادة الضوء (على سبيل المثال، +10) والتباين (حسب، +20*).

1.4 بناء خط أنابيب المعالجة والتجهيز المسبق

var processingOptions = new ImageProcessingOptions();
processingOptions.Filters.Add(filterOptions);
processingOptions.Contrast = contrastOptions;

// (Optional) more options can be added here if your build exposes them
// e.g., processingOptions.Sharpen = new SharpenOptions { Strength = 1 };

using (var ocrEngine = new Aspose.Ocr.Api.OcrEngine())
{
    Bitmap preprocessed = ocrEngine.PreprocessImage(image, processingOptions);
    // Keep this for OCR below
    image.Dispose();
    image = preprocessed;
}

1.5 (اختياري) Upscale نص صغير

إذا كان النص صغيرًا للغاية** (ارتفاع <10px) ، قم بتسخين قبل OCR باستخدام إعادة عينة عالية الجودة.

// 1.5 Optional: upscale 1.5x to help recognition of tiny text
Bitmap Upscale(Bitmap src, double scale)
{
    int w = (int)(src.Width * scale);
    int h = (int)(src.Height * scale);
    var dest = new Bitmap(w, h);
    using (var g = Graphics.FromImage(dest))
    {
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.DrawImage(src, 0, 0, w, h);
    }
    return dest;
}

// Example usage
// image = Upscale(image, 1.5);

1.6 (اختياري) زراعة منطقة من الفائدة (ROI)

إذا كنت بحاجة إلى حصة واحدة فقط (على سبيل المثال، العنوان، إجمالي الفواتير)، والزراعة للحد من التجاعيد والخطأ.

// Crop a rectangle (x,y,width,height)
Rectangle roi = new Rectangle(0, 0, image.Width, Math.Min(400, image.Height)); // top band
Bitmap cropped = image.Clone(roi, image.PixelFormat);
image.Dispose();
image = cropped;

1.7 (اختياري) التدوين السريع (DIY)

إذا كانت ألوان الخلفية معقدة، تحويلها إلى الحجم الرمادي والحد الأقصى. (استخدم هذا فقط إذا بناء OCR الخاص بك يفتقر إلى خيار التجزئة المخصصة؛ انها سحب بسيط.)

// Simple grayscale + global threshold (0..255); try 170..200
Bitmap ToBinary(Bitmap src, byte threshold = 185)
{
    var bw = new Bitmap(src.Width, src.Height);
    for (int y = 0; y < src.Height; y++)
    for (int x = 0; x < src.Width; x++)
    {
        var c = src.GetPixel(x, y);
        byte gray = (byte)(0.299 * c.R + 0.587 * c.G + 0.114 * c.B);
        byte v = gray >= threshold ? (byte)255 : (byte)0;
        bw.SetPixel(x, y, Color.FromArgb(v, v, v));
    }
    return bw;
}

// Example usage
// var bin = ToBinary(image, 190);
// image.Dispose();
// image = bin;

الخطوة 2 – إعداد الإعدادات OCR (اختياري، إذا كان متاحا في بناءك)

بعض Aspose.OCR البناء يعرض الإعدادات على مستوى المحرك.إذا حزمة لديك لهم، إعداد اللغة و صفحة التخطيط إشارات للمساعدة في تقسيم والتعرف.

// Only if your build exposes these settings:
using Aspose.Ocr;

var settingsAvailable = false; // flip true if your API supports it
// Example (may vary by package version):
// ocrEngine.Settings.Language = RecognitionLanguages.English;
// ocrEngine.Settings.PageSegmentationMode = PageSegmentationMode.Auto;
  • متى يجب إعداد: *
  • اللغات المختلطة: انتقل إلى الوضع اللغوي المناسب أو المتعدد اللغة.
    • الكتب المكتوبة :** PageSegmentationMode.Auto أو * الوثيقة * وضع .
  • النماذج/الجدول: يفضل ترتيب المستند؛ زراعة للمنطقة في أي وقت ممكن.

الخطوة 3 – تشغيل OCR & Evaluate

هذا هو التيار الدقيق من الرماد: ما قبل المعالجة → التعرف → الطباعة.

using System;
using System.Drawing;
using Aspose.Ocr;
using Aspose.Ocr.ImageProcessing;

namespace OCRImprovementExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string imagePath = "low_quality_image.png";
            Bitmap image = (Bitmap)Image.FromFile(imagePath);

            // Preprocess (median + contrast/brightness)
            var filterOptions = new FilterOptions { MedianFilter = true, MedianFilterSize = 3 };
            var contrastOptions = new ContrastOptions { ContrastAdjustment = 20, BrightnessAdjustment = 10 };
            var processingOptions = new ImageProcessingOptions();
            processingOptions.Filters.Add(filterOptions);
            processingOptions.Contrast = contrastOptions;

            using (Aspose.Ocr.Api.OcrEngine ocrEngine = new Aspose.Ocr.Api.OcrEngine())
            {
                // Preprocess
                Bitmap preprocessedImage = ocrEngine.PreprocessImage(image, processingOptions);

                // OCR
                string recognizedText = ocrEngine.RecognizeImage(preprocessedImage);

                Console.WriteLine("Recognized Text:");
                Console.WriteLine(recognizedText);
            }
        }
    }
}

** نص تصدير:** اكتب إلى ملف للتحقق:

File.WriteAllText("recognized.txt", recognizedText);

الأعراض → Fix (Cheat-Sheet مع خيارات API)

Symptomماذا تحاولكيفية إعداد (الرمز)
الضوضاء الضوئية / المواد JPEGالفلتر المتوسط (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
*الظلام الظلام *زيادة الضوء (+5..+15) والتباين (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* تم غسلها *انخفاض الضوء (-5..-15) ، تناقض معتدلBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* نص صغير جدا *مقياس × 1.25 × 1.75. ثم OCRimage = Upscale(image, 1.5);
الخلفية الغامضة / الضوضاء الملونةDIY الثنائية أو زراعة ROIvar bin = ToBinary(image, 185); أو image = image.Clone(roi, ...)
* مسح الضوء *تثبيت (إذا تم التعرض له) أو إعادة الفحص(إذا كان بناءك يعرض خيار Deskew، قم بتشغيله؛ إلخ زراعة & إنقاذ)
* اللغات المختلطة *إعداد لغة OCR(s) صراحة(إذا كانت متوفرة) ocrEngine.Settings.Language = RecognitionLanguages.English;
* المحتوى اللوحي *النباتات إلى منطقة الجدول قبل OCRimage.Clone(roi, image.PixelFormat)

لا تظهر جميع المباني نفس إعدادات المحرك**.إذا لم تكن الممتلكات متوفرة في حزمة، يعتمد على تقنيات معالجة الصور المسبقة** المذكورة أعلاه – فهي API مستقرة وفعالة.

أفضل الممارسات

  • تدفق في خطوات صغيرة. تغيير واحد من المعلمات في وقت واحد (على سبيل المثال، MedianFilterSize 3 → 5) ومقارنة النتائج.
  • ** يفضل ROI.** تصل إلى المنطقة ذات الصلة فقط في كثير من الأحيان ضرب أي فلتر.
  • تجنب الإفراط في المعالجة. يمكن أن يفسد الكثير من البراغيث / التخفيضات أشكال الجليف.
  • البازيلينات التلقائية. احفظ مجموعة صغيرة من الصور الذهبية الخيالية وتشغيلها في CI لتحديد الانكماش.
  • ** حفظ الوسائط.** حفظ الصور المعالجة مسبقًا إلى ./debug/ المجلدات أثناء التونين.

More in this category