Pocs escans, fotografies de telèfon, faxes i captures de pantalla comprimides sovint derroten l’OCR. La bona notícia: una petita preprocessament va un llarg camí. Aquesta guia li dóna passos pràctics, executables (alineats amb la fusta al final) per netejar les imatges pre OCR i a tune el motor de la OCR per a resultats significativament millors.

Exemple complet

Prerequisits

  • .NET 8 (o .NET 6+) SDK
  • El nou: Aspose.OCR
  • ( és opcional) Aspose.Total.lic Si vols superar els límits d’avaluació

Crear una aplicació de consola i afegir el paquet:

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

Pas 1 - Preprocés d’imatges de baixa qualitat

**Objectiu: Reduir el soroll, normalitzar el contrast / brillantor, i (opcionalment) augmentar o cultivar abans de l’OCR.

1.1 Carregar la imatge

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 Eliminació del soroll (filtre mitjà)

Utilitza un filtre mitjà per suprimir el soroll de sal i pebre i els artifactes 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
};
  • Quan es pot canviar: *
  • Si encara veus els miralls, aixeca’t MedianFilterSize A més de *5 *.
  • Si els caràcters petits desapareixen, caure de nou a 3 o desactivar-lo.

1.3 Normalitzar el contrast / brillantor

Fes que el text surti del fons.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Regles de l’esquena: *
  • **Over-exposat: * disminueix la brillantor (per exemple, -10) i manté el contrast moderat.
  • Underexposat (molt fosc): ** augmentar la brillantor (per exemple, +10) i el contrast (Per exemple ** +20).

1.4 Construcció de tubs de processament i preprocés

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 (opcional) Títol minúscul d’escala

Si el text és molt petit (<10px d’altura), escalfar ** abans** OCR utilitzant ressampling de gran qualitat.

// 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 (opcional) Creu una regió d’interès (ROI)

Si vostè només necessita una porció (per exemple, el títol, els continguts de la factura), la planta per reduir el coll i l’error.

// 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 (opcional) Binarització ràpida (DIY)

Si els colors de fons són complexos, es converteix en gris i límit. (Usereu això només si la vostra construcció OCR no té una opció de binarització dedicada; és un simple 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;

Pas 2 - Configuració de la configuració OCR (opcional, si està disponible en el teu edifici)

Alguns edificis Aspose.OCR exposen les configuracions de nivell del motor. Si el seu paquet els té, estableix llengua i layout de pàgina indicacions per ajudar a la segmentació i el reconeixement.

// 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;
  • Quan s’ha de posar: *
  • ** Llengües mixtes:** canviar a la llengua apropiada o el mode de múltiples llengües.
    • Els blocs de text: * PageSegmentationMode.Auto o *Modificació de documents.
  • Forms/taules: prefereix la segmentació Document; cultiu a la regió quan sigui possible.

Etapa 3 – Fes OCR i avaluació

Aquest és el flux exacte de l’host: preprocés → reconeixement → impressió.

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

Texte d’exportació: escriure a un arxiu per a la inspecció :

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

Símptoma → Fix (Cheat-Sheet amb opcions API)

SymptomQuè intentarCom establir el codi (codi)
* El soroll de l’especle / els artifactes JPEG**Filtre mitjà (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
Tot el fosc*Augmenta la brillantor (+5..+15) i el contrast (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* S’ha esborrat *Disminució de la brillantor (-5..-15), contrast moderatBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* molt petit text *Màxima x 1.25 x 1.75, Després OCRimage = Upscale(image, 1.5);
Bús de fons / soroll de colorDIY binarització o crop ROIvar bin = ToBinary(image, 185); o image = image.Clone(roi, ...)
* Esquema de l’escàndol *Deskew (si exposada) o re-escaneig de l’estratègia(Si la seva construcció exposa una opció Deskew, habiliteu-la; d’altra banda crop & rescan)
* Llengües mixtes *Configuració del llenguatge OCR(s) explícitament(si està disponible) ocrEngine.Settings.Language = RecognitionLanguages.English;
* El contingut de la taula*Planta a la regió de taula abans de l’OCRimage.Clone(roi, image.PixelFormat)

No tots els edificis exposen les mateixes configuracions del motor**. Si una propietat no està disponible en el seu paquet, estigueu basats en les tècniques de preprocessament d’imatge** anteriorment – són API-estables i eficaços.

Les millors pràctiques

  • Tweak en petits passos. Canviar un paràmetre a la vegada (per exemple, MedianFilterSize 3 → 5) i comparar les sortides.
  • ** Prefereix ROI.** Creping a només l’àrea rellevant sovint bat qualsevol filtre.
  • Eviteu el processament excessiv. L’excés de blur/upscaling pot destruir les formes de glyph.
  • Basselines automàtiques. Mantenir un petit conjunt d’imatges dolços i executar-los en CI per detectar regressions.
  • Salva els intermediats. Salva les imatges preprocessades a un ./debug/ Fòrum durant el tuning.

More in this category