Slechte scans, telefoonfoto’s, facsen en gecomprimeerde screenshots verliezen vaak de OCR. Het goede nieuws: een kleine pre-verwerking gaat een lange weg. Deze gids geeft u praktische, runsbare stappen (in overeenstemming met de gist aan het einde) om afbeeldingen te reinigen voor O CR en om tune de oCR-motor voor aanzienlijk betere resultaten.

Volledige voorbeeld

Voorwaarden

  • .NET 8 (of .Net 6+) SDK
  • NuGet : Aspose.OCR
  • (de optie van de Aspose.Total.lic Als u de beoordelingsgrens overschrijdt

Creëer een console app en voeg het pakket toe:

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

Stap 1 - Voorverwerking van afbeeldingen van lage kwaliteit

Doel: het verminderen van lawaai, normaliseren contrast / helderheid en (optioneel) opschalen of planten vóór OCR.

1.1 De afbeelding opladen

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 Verwijder geluid (median filter)

Gebruik een medianfilter om zout en peper geluiden en JPEG-artifacten te onderdrukken.

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
};
  • Wanneer te veranderen: *
  • Als je nog steeds spiegel ziet, verhoog MedianFilterSize tot * 5 *.
  • Als kleine tekens verdwijnen, gooi dan terug naar 3 of draai het uit.

1.3 Normaliseren van contrast / helderheid

Maak tekst uit de achtergrond.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Regels van thumb: *
  • ** Overdekt (wassen):** vermindert de helderheid (bijvoorbeeld -10) en houdt het contrast matig.
  • Under blootgesteld ( te donker): verhoogt de helderheid (bijvoorbeeld +10) en het contrast (bv. +20*).

1.4 Constructie van de verwerking en preprocessen

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 (Optioneel) Upscale kleine tekst

Als de tekst very small (<10px hoogte), upscale before OCR met behulp van hoogwaardige 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 (Optioneel) Groeien in een Interestgebied (ROI)

Als je alleen maar een portie nodig hebt (bijvoorbeeld header, factuur totalen), groeien om de kloot en fout te verminderen.

// 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 (Optioneel) Snelle binarisatie (DIY)

Als de achtergrondkleuren complex zijn, converteer naar groen schaal en drempel. (Uit dit ** alleen als** uw OCR bouw ontbreekt een toegewijde binarisatie optie; het is een eenvoudige 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;

Stap 2 — Configure OCR Settings (optional, indien beschikbaar in uw bouw)

Sommige Aspose.OCR builds blootstellen instellingen op motorniveau.Als uw pakket ze heeft, installeer taal en pagina layout tips om segmentatie en herkenning te helpen.

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

Wanneer te bepalen:

  • Mixed languages: wisselen naar de juiste taal of meertaal modus.
  • Dense tekst blokken: PageSegmentationMode.Auto Of ** Document** modus.
  • Forms/tables: voorkeur Document segmentatie; groeien naar de regio wanneer mogelijk.

Stap 3 – Run OCR & Evaluate

Dit is de exacte stroom van de gist: preprocess → herkennen → afdrukken.

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

Exporteer tekst: schrijf in een bestand voor inspectie:

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

Symptomen → Fix (Cheat-Sheet met API-opties)

SymptomWat te proberenHoe te installeren (code)
** Speckle geluid / JPEG-artifacten**Mediane filter (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
‘Too Dark’Verhoog helderheid (+5..+15) en contrast (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* uitgewassen *Verminderde helderheid (-5..-15), matig contrastBrightnessAdjustment = -10, ContrastAdjustment = 10..20
Veel klein tekstUpscale × 1.25–× 1.75 Daarna OCRimage = Upscale(image, 1.5);
* Boze achtergrond / kleurrijke lawaai*DIY binarisatie of crop ROIvar bin = ToBinary(image, 185); of image = image.Clone(roi, ...)
* Verwijderde scan*Deskew (indien blootgesteld) of re-scan straighter(Als uw bouw een Deskew-optie blootstelt, kunt u het activeren; anders groeien & redden)
* gemengde talen *Set OCR taal(s) uitdrukkelijk(Als beschikbaar is) ocrEngine.Settings.Language = RecognitionLanguages.English;
Tabulair inhoudPlanten naar de tabelregio vóór OCRimage.Clone(roi, image.PixelFormat)

Niet alle gebouwen blootstellen dezelfde machine-instellingen. Als een eigendom niet beschikbaar is in uw pakket, vertrouw op de image pre-processing technieken hierboven – ze zijn API-stabiel en effectief.

Beste praktijken

  • Tweak in kleine stappen. Verander één parameter tegelijkertijd (bijv. MedianFilterSize 3 → 5) en vergelijk de uitgangen.
  • Voorkeur ROI. Het kruipen naar alleen het relevante gebied slaat vaak elke filter.
  • Vermijd oververwerking. Te veel blur/upscaling kan glyph-vormen vernietigen.
  • Automatische basels. Houd een kleine gouden set van tricky beelden vast en draai ze in CI om regressie te detecteren.
  • Save intermediates. Speel vooraf verwerkt afbeeldingen op een ./debug/ Folders tijdens het tunen.

More in this category