סריקות גרועות, צילומי טלפון, פקסים, וצלמות מסך מדכאות לעתים קרובות להביס את OCR. החדשות הטובות: העבודה המוקדמת קטנה הולכת דרך ארוכה. מדריך זה נותן לך שלבים מעשיים, מתקדמים (התואמים עם השטיח בסופו של דבר) כדי לנקות את התמונות **לפני **OCR ולתת Tune את מנוע ה-OCR עבור תוצאות טובות באופן משמעותי.

דוגמה מלאה

דרישות

  • תגית: .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), upscale לפני 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)

אם צבעים רקע הם מורכבים, להפוך ל- grayscale ו- threshold. (שימוש זה ** רק אם** 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 – Run 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);

סימפטום → תיקון (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 בינאריזציה או Crop ROIvar bin = ToBinary(image, 185); או image = image.Clone(roi, ...)
* סריקה מופרזת *דסק (אם מופיע) או סריקה מחדש(אם המבנה שלך מופיע באפשרות Deskew, הפעל את זה; אחרת crop & rescan)
* שפות מעורבות *הגדרת שפה OCR(s) באופן מפורש(אם זמינים ) ocrEngine.Settings.Language = RecognitionLanguages.English;
* תוכן טבלה *צמחים לאזור השולחן לפני OCRimage.Clone(roi, image.PixelFormat)

אם נכס אינו זמין בחבילה שלך, להסתמך על טכניקות עיבוד תמונה מראש לעיל – הם API-יציב ויעיל.

שיטות טובות

  • לשבור בשלבים קטנים. לשנות פרמטרים בבת אחת (לדוגמה, MedianFilterSize 3 → 5) ולהשוות את היציאות.
  • עדיף ROI. קרופינג לתוך האזור הרלוונטי בלבד לעתים רחוקות פוגע בכל מסנן.
  • ימנע מעובד מוגזם. יתר על המידה של בלור/אופסקלינג יכול להרוס צורות גליף.
  • בייסלים אוטומטיים. שמור קבוצה קטנה של תמונות מטומטמות ומפעיל אותן ב- CI כדי לזהות regressions.
  • שמור מתווכים. שמור תמונות מעובדות ל- ./debug/ קובץ במהלך טונינג.

More in this category