Les mauvaises scans, les photos téléphoniques, des faxes et les captures d’écran comprimées perdent souvent l’OCR. La bonne nouvelle: un peu de pré-processage va un long chemin. Ce guide vous donne des étapes pratiques, rationnables (alignés avec le gêne à la fin) pour nettoyer les images avant OCR et pour tune le moteur de la OCR pour des résultats significativement meilleurs.

Exemple complet

Principaux

  • .NET 8 (ou .Net 6+) SDK
  • Nouveau : Aspose.OCR
  • (d’une option) Aspose.Total.lic Si vous prévoyez de dépasser les limites d’évaluation

Créez une application de console et ajoutez le package :

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

Étape 1 - Pré-procession d’images de faible qualité

** Objectif: ** Réduire le bruit, normaliser le contraste / la luminosité et (optionnellement) augmenter ou cultiver avant l’OCR.

1.1 Télécharger l’image

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 Supprimer le bruit (filtre moyen)

Utilisez un filtre ** moyen** pour supprimer le bruit de sel et de pépine et les objets 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
};
  • Quand changer : *
  • Si vous voyez encore des miroirs, élevez MedianFilterSize à * 5 *.
  • Si les caractères minces disparaissent, descendez à 3 ou éteignez-les.

1.3 Normaliser le contraste / luminosité

Faites le texte sortir de l’arrière-plan.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Les règles du thumb :*
  • Overexposé (pouché): réduit la luminosité (par exemple, -10) et maintient le contraste modéré.
  • ** Underexposé (trop sombre):** augmenter la luminosité (par exemple, +10) et le contraste (p. ex., ** +20**).

1.4 Construction de pipeline de traitement et pré-procession

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 (Optionnel) Télécharger un texte minuscule

Si le texte est très petit (<10px hauteur), écrasez avant OCR en utilisant un recyclage de haute 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 (Optionnelle) Cultiver une région d’intérêt (ROI)

Si vous n’avez besoin que d’une portion (par exemple, le titre, les montants de facture), la culture pour réduire la coquille et l’erreur.

// 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 (Optionnelle) Binarisation rapide (DIY)

Si les couleurs d’arrière-plan sont complexes, convertis à la graisse et le seuil. (Utilisez ce ** uniquement si** votre OCR construit manque une option de binarisation dédiée; c’est un simple recul.)

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

Étape 2 — Configurer les paramètres OCR (optional, si disponible dans votre bâtiment)

Certains bâtiments Aspose.OCR exposent les paramètres au niveau du moteur. Si votre paquet les a, définissez ** langue** et ** layout de page** des indices pour aider la segmentation et la reconnaissance.

// 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;
  • Quand faire : *
  • ** Langues mélangées:** Changer vers la langue appropriée ou le mode multi-langue.
    • Les blocs de texte :** PageSegmentationMode.Auto Ou le mode « Documents ».
  • Formes/tables: préférez la segmentation Document; récolte à la région quand c’est possible.

Étape 3 – Exécuter l’OCR et évaluer

Ceci est le flux exact de l’aiguille: pré-procession → reconnaître → imprimer.

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’exportation: écrivez à un fichier pour l’inspection:

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

Symptôme → Fix (Cheat-Sheet avec les options API)

SymptomQue faire essayerComment définir (code)
* Le bruit de l’écran / les objets JPEG**Le filtre moyen (3 à 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
« Toos sombres »Augmentez la luminosité (+5..+15) et le contraste (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* Laissez-vous laver*Réduction de la luminosité (-5..-15), contraste modéréeBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* Très petit texte *L’échelle est de 1,25 à 1,75 Puis OCRimage = Upscale(image, 1.5);
Bouchon / bruit de couleurDIY Binarisation ou Crop ROIvar bin = ToBinary(image, 185); ou image = image.Clone(roi, ...)
* L’écran éteint*Deskew (si exposé) ou re-scan stricter(Si votre bâtiment expose une option Deskew, activez-la; autre crop & rescan)
* Les langues mixtes *Définir explicitement le langage (s) de l’OCR(en cas de disponibilité) ocrEngine.Settings.Language = RecognitionLanguages.English;
* Contenu de tableau *Plante à la région de table avant l’OCRimage.Clone(roi, image.PixelFormat)

Tous les bâtiments ne présentent pas les mêmes paramètres de moteur**. Si une propriété n’est pas disponible dans votre paquet, reliez-vous aux techniques de pré-traitement d’image** ci-dessus – elles sont API stables et efficaces.

Migliori pratiche

  • Tweak en petits pas. Changer un paramètre à la fois (par exemple, MedianFilterSize 3 → 5) et comparer les sorties.
  • ** Préférez le ROI.** Cropping à la seule zone pertinente frappe souvent n’importe quel filtre.
  • ** Évitez le sur-traitement.** Trop de blur/upcaling peut détruire les formes de glyphes.
  • Baselines automatiques. Gardez un petit ensemble d’images dorés et faites-les en CI pour détecter les regressions.
  • Enregistrer les intermédiaires. Enregistrez des images prépracées à un ./debug/ Mise en scène pendant le tuning.

More in this category