Le scansioni cattive, le riprese telefoniche, i fax e le screenshots compressi spesso sconfiggono l’OCR. La buona notizia è che un piccolo preprocessamento va lungo. Questa guida ti dà passi prattici, eseguibili (alineati con il gesto alla fine) per pulire le immagini pre OCR e per tune il motore dell’OKR per risultati significativamente migliori.

Esempio completo

Prerequisiti

  • .NET 8 (o .Net 6+) SDK
  • di NuGet: Aspose.OCR
  • (a seconda delle opzioni) Aspose.Total.lic se si intende superare i limiti di valutazione

Crea un’app di console e aggiungi il pacchetto:

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

Passo 1 – Preprocessione di immagini di bassa qualità

** Obiettivo: ** ridurre il rumore, normalizzare il contrasto/brillo e (opzionale) crescere o coltivare prima dell’OCR.

1.1 Carica l’immagine

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 Rimuovere il rumore (filtro medio)

Utilizzare un filtro mediano per sopprimere il rumore di sale e pepe e gli articoli 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
};

Quando si cambia: *

  • Se vedete ancora gli specchi, alzate MedianFilterSize di * 5 *.
  • Se i piccoli caratteri scompaiono, scendere indietro a 3 o spegnere.

1.3 Normalizza il contrasto / luminosità

Lascia che il testo si allontani dal background.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Regole del tumbo: *
  • Overexposed (sconosciuto): riduce la luminosità (ad esempio, -10) e mantiene il contrasto moderato.
  • Non esposto (molto buio): aumentare la luminosità (ad esempio, +10) e il contrasto ( ad esempio +20*).

1.4 Costruzione del tubo di elaborazione e prelievo

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 (opzionale) Upscale piccolo testo

Se il testo è molto piccolo (<10px altezza), upscale pre OCR utilizzando riassemblaggio di alta qualità.

// 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 (opzionale) Crop a Region of Interest (ROI)

Se hai solo bisogno di una porzione (ad esempio, il titolo, i totali di fattura), raccolta per ridurre la crosta e l’errore.

// 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 (opzionale) Rapida binarizzazione (DIY)

Se i colori di sfondo sono complessi, convertire in grigio e soglia. (Utilizza questo solo se la tua costruzione OCR manca un’opzione di binarizzazione dedicata; è un semplice 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;

Passo 2 - Configurare le impostazioni OCR (opzionale, se disponibile nella tua costruzione)

Alcuni Aspose.OCR costruiscono l’esposizione delle impostazioni a livello del motore.Se il pacchetto li ha, impostare lingua e ** layout della pagina** indicazioni per aiutare la segmentazione e il riconoscimento.

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

Quando è necessario impostare:

  • Lingue miste: scorrere al modo linguistico o multi-lingue appropriato.
    • Blocco di testo: * PageSegmentationMode.Auto o * Modalità di documentazione *.
  • Form/Tabelle: Preferisce la segmentazione Documento; coltiva la regione ogni volta che possibile.

Passo 3 – Eseguire OCR & Valutazione

Questo è il ** flusso esatto** dal gesto: preprocess → riconoscere → stampare.

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

Testo di esportazione: scrivere in un file per l’ispezione:

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

Sintoma → Fix (Cheat-Sheet con opzioni API)

SymptomCosa provareCome impostare il codice (code)
** Speckle rumore / argomenti JPEG**Il filtro medio (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
“Too oscuro”Aumentare la luminosità (+5..+15) e il contrasto (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* Lavato fuori *Riduce la luminosità (-5..-15), contrasto moderatoBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* Il testo è molto piccolo*Dimensioni di dimensioni × 1.25–× 1.75 Poi OCRimage = Upscale(image, 1.5);
Buso sfondo / rumore di coloreDIY binarizzazione o crop ROIvar bin = ToBinary(image, 185); o image = image.Clone(roi, ...)
* Scansione scanata*Deskew (se esposto) o re-scan straigher(Se la tua costruzione esprime un’opzione Deskew, abilitala; altrimenti crop & rescan)
* Lingue miste *Set OCR linguaggio(s) esplicitamente(se è disponibile) ocrEngine.Settings.Language = RecognitionLanguages.English;
* Contenuti tabulari*Le piante nella regione di tabella prima dell’OCRimage.Clone(roi, image.PixelFormat)

Non tutti gli edifici esposano le stesse impostazioni del motore**.Se una proprietà non è disponibile nel tuo pacchetto, affidati alle tecniche pre-processing di cui sopra – sono API stabili ed efficaci.

Migliori pratiche

  • Tweak in piccoli passaggi. Modifica un parametro contemporaneamente (ad esempio, MedianFilterSize 3 → 5) e confrontare le uscite.
  • Preferisce ROI. La croppatura a solo la zona rilevante spesso colpisce qualsiasi filtro.
  • ** Evitare l’eccessiva trasformazione.** Troppa blur/upscaling può distruggere le forme glifiche.
  • Bazeline automatiche. Mantenere un piccolo set d’oro di immagini tricolose e eseguire in CI per rilevare le regressioni.
  • Salva gli intermediati. Salva le immagini preprocessate a un ./debug/ Fornitura durante il tuning.

More in this category