Schlechte Scans, Telefon-Shots, Fax- und komprimierte Screenshots besiegen oft OCR. Die gute Nachricht: eine kleine Vorverarbeitung geht einen langen Weg. Dieser Leitfaden gibt Ihnen praktische, laufbare Schritte (auf dem Ende mit dem Gerät abgestimmt) um Bilder zu reinigen **vor **OCR und zu tune den OCC-Motor für signifikant bessere Ergebnisse.

Vollständiges Beispiel

Voraussetzung

  • .NET 8 (oder .Net 6+) SDK
  • Neugier : Aspose.OCR
  • (für die Option) Aspose.Total.lic wenn Sie die Bewertungsgrenze überschreiten möchten

Erstellen Sie eine Konsole-App und fügen Sie das Paket hinzu:

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

Schritt 1 - Vorverarbeitung niedriger Bildqualität

**Ziel: ** Reduzieren Sie den Lärm, normalisieren sie den Kontrast/Lichtigkeit und (optional) erhöhen Sie oder wachsen Sie vor OCR.

1.1 Laden Sie das Bild

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 Entfernen von Lärm (Mittelfilter)

Verwenden Sie einen Medianfilter, um das Geräusch von Salz und Papier und JPEG-Artifakten zu unterdrücken.

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
};
  • Wann ändern Sie sich: *
  • Wenn Sie noch Spiegel sehen, erhöhen Sie MedianFilterSize zu * 5 *.
  • Wenn kleine Zeichen verschwinden, fallen Sie zurück auf 3 oder deaktivieren Sie es.

1.3 Normalisieren Sie den Kontrast / Licht

Stellen Sie den Text aus dem Hintergrund heraus.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Regeln des Thumb: *
  • ** Überschwemmt (waschen):** reduziert die Helligkeit (z. B. -10) und hält den Kontrast mäßig.
  • ** Underexponiert (zu dunkel):** erhöht die Beleuchtung (z. B. +10) und den Kontrast (zum Beispiel ** +20**).

1.4 Konstruktion von Verarbeitungsleitungen & Vorverarbeitung

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 (Optional) Upscale kleines Text

Wenn der Text ** sehr klein** (<10px Höhe) ist, erhöhen Sie vor OCR mit hochwertigem Resampling.

// 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 (Optional) Pflanzen in einer Interessregion (ROI)

Wenn Sie nur eine Portion (z. B. Header, Rechnungsvolumen) benötigen, können Sie die Ernte zur Verringerung von Schlamm und Fehler reduzieren.

// 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 (Optional) Schnelle Binarisierung (DIY)

Wenn die Hintergrundfarben komplexer sind, konvertieren Sie sie in grayscale und threshold. (Nutzen Sie dies nur, wenn Ihr OCR-Build fehlt eine dedizierte binary-Option; es ist ein einfacher Fallback.)

// 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;

Schritt 2 — Konfigurieren Sie die OCR-Einstellungen (Optional, wenn in Ihrem Bau verfügbar)

Einige Aspose.OCR Builds zeigen Motor-Ebene Einstellungen. Wenn Ihr Paket sie hat, setzen Sie Sprache und Seite-Layout Hinweise, um Segmentation und Anerkennung zu unterstützen.

// 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;

*Wenn zu setzen: *

  • Mixed languages: wechseln Sie zum angemessenen Sprache- oder mehrsprachigen Modus.
  • Dense Textblöcke: PageSegmentationMode.Auto oder Dokument Modus.
  • **Forms/Tabellen: ** bevorzugt Dokument Segmentation; Pflanzen für die Region, wenn möglich.

Schritt 3 – Run OCR & Evaluate

Dies ist der exakte Fluss aus dem Gehirn: Vorverarbeitung → Erkennen → Drucken.

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

Exportieren Text: Schreiben Sie in eine Datei für die Inspektion:

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

Symptom → Fix (Cheat-Sheet mit API-Optionen)

SymptomWas zu versuchenWie Sie einrichten (Code)
** Speckle Lärm / JPEG-Artikel**Mittlerer Filter (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
„Too Dark“Erhöhen Sie die Beleuchtung (+5..+15) und den Kontrast (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* abgelaufen*Verringerung der Beleuchtung (-5..-15), moderate KontrastBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* sehr geringes Text*Größe × 1.25–× 1.75 Dann OCRimage = Upscale(image, 1.5);
Bosy Hintergrund / Farbe LärmDIY Binarisierung oder Crop ROIvar bin = ToBinary(image, 185); oder image = image.Clone(roi, ...)
* Verschlüsselte Scannen*Deskew (wenn ausgedrückt) oder re-scan straighter(Wenn Ihr Bau eine Deskew-Option exponiert, aktivieren Sie es; sonst Crop & rescan)
* Gemischte Sprachen*OCR Sprache(s) ausdrücklich festlegen(wenn verfügbar ist) ocrEngine.Settings.Language = RecognitionLanguages.English;
* Tabelleinhalte*Pflanzen in der Tabellenregion vor OCRimage.Clone(roi, image.PixelFormat)

Nicht alle Gebäude zeigen die gleichen Motor-Einstellungen. Wenn eine Eigenschaft nicht in Ihrem Paket verfügbar ist, verlassen Sie sich auf die Image Pre-Processing Techniken oben – sie sind API-stabil und wirksam.

Beste Praktiken

  • Schweiß in kleinen Schritten. Ändern Sie einen Parameter zu einem Zeitpunkt (z. B. MedianFilterSize 3 → 5) und vergleichen Sie die Ausgänge.
  • Preferer ROI. Kreuzung auf nur das entsprechende Gebiet schlägt oft jedes Filter.
  • ** Vermeiden Sie Überverarbeitung.** Zu viel Blur/Upscaling kann Glyphformen zerstören.
  • Automatische Baselinen. Halten Sie ein kleines goldenes Set an trickhaften Bildern und laufen Sie sie in CI, um Regressionen zu erkennen.
  • Save intermediates. Speichern Sie vorverarbeitete Bilder auf eine ./debug/ Folder während der Tuning.

More in this category