Scanurile proaste, fotografiile telefonice, faksele și screenshots comprimate în mod frecvent înfrâng OCR. Vestea bună: un pic de prelucrare merge pe o lungă cale. Acest ghid vă oferă pașii praktice, rulabile (aliniate cu gâtul la capăt) pentru a curăța imaginile pre OCC și pentru tune motorul OCD pentru rezultate semnificativ mai bune.

Exemplu complet

Prevederile

  • Cuvânt cheie: .NET 8 (sau .Net 6+)
  • Încă nu: Aspose.OCR
  • (de la opţiune ) Aspose.Total.lic Dacă intenționați să depășiți limitele de evaluare

Creați o aplicație de console și adăugați pachetul:

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

Pasul 1 – Preprocesarea imaginii de calitate scăzută

Obiectiv: reducerea zgomotului, normalizarea contrastului / luminozității și (opțional) creșterea sau cultivarea înainte de OCR.

1.1 Încărcați imaginea

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 Îndepărtarea zgomotului (filtru mediu)

Utilizați un filtru median pentru a suprimă zgomotul de sare și piper și materialele 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
};

*Când să se schimbe: *

  • Dacă vedeți spectrele, ridicați-vă MedianFilterSize pentru * 5 *.
  • Dacă mici caractere dispar, aruncați-le înapoi la 3 sau dezactivați.

1.3 Normalizarea contrastului / luminozității

Faceți textul să apară din fundal.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Reguli de la Tumb: *
  • Expunere excesivă (deschisă): reduce luminozitatea (de exemplu, -10) și menține contrastul moderat.
  • ** Underexposed (prea întunecat):** crește luminozitatea (de exemplu, +10) și contrastul (dacă se referă la +20*).

1.4 Construcția pipelinei de prelucrare și preproces

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 (opțional) text mic la scară superioară

Dacă textul este foarte mic (<10px înălțime), upscalează pre OCR folosind reamplare de înaltă calitate.

// 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 (opțional) Cultivarea unei regiuni de interes (ROI)

Dacă aveți nevoie doar de o porție (de exemplu, titlu, totaluri de factură), cultivarea pentru a reduce grăsimea și erorile.

// 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 (opțional) binarizare rapidă (DIY)

Dacă culorile de fundal sunt complexe, convertiți-vă la grayscale și praguri. (Utilizați acest lucru ** numai dacă** construcția dvs. OCR nu are o opțiune dedicată de binarizare; este o simplă descărcare.)

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

Pasul 2 – Configurați setările OCR (opțional, dacă este disponibil în ediția dvs.)

Unele structuri Aspose.OCR expun setările la nivel de motor. Dacă pachetul dvs. le are, setarea limbă și layout pagină indicații pentru a ajuta segmentarea și recunoașterea.

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

Când să se stabilească:

  • Limbile amestecate: Schimbați-vă la modul lingvistic sau multilingv corespunzător.
    • Blocuri de text din Danemarca:** PageSegmentationMode.Auto • Modul de documentare.
  • Formele/tabele: Preferă segmentarea Document; cultivarea în regiune ori de câte ori este posibil.

Pasul 3 – Run OCR & Evaluate

Acesta este fluxul exact** din ghid: preproces → recunoaștere → imprimare.

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 de export: Scrieți la un fișier pentru inspecție:

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

Simptom → Fix (Cheat-Sheet cu opțiuni API)

SymptomCe să încerciCum se stabilește codul (code)
Răspunsuri de zgomot / JPEG artefacteFiltru mediu (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
„Totul întunecat”Crește luminozitatea (+5…+15) și contrastul (+10..+25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* îndepărtate *Reducerea luminozității (-5..-15), contrastul moderatBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* Text foarte mic*Upscale × 1.25–× 1.75, Apoi OCRimage = Upscale(image, 1.5);
Buză de fundal / zgomot de culoareDIY binarizare sau crop ROIvar bin = ToBinary(image, 185); sau image = image.Clone(roi, ...)
* scanare înclinată*Deskew (dacă este expusă) sau re-scan straighter(Dacă construcția dvs. expune o opțiune Deskew, activați-o; în caz contrar crop & rescan)
Limbile mixteSetarea explicită a limbajului (s) OCR(în cazul în care este disponibil) ocrEngine.Settings.Language = RecognitionLanguages.English;
* Conținutul tabelului*Planta la regiunea de masă înainte de OCRimage.Clone(roi, image.PixelFormat)

În cazul în care o proprietate nu este disponibilă în pachetul dvs., se bazează pe tehnicile de prelucrare a imaginii de mai sus – acestea sunt API-stabile și eficiente.

Cele mai bune practici

  • Tweak în pași mici. Schimbați un parametru la un moment dat (de exemplu, MedianFilterSize 3 → 5) și comparați rezultatele.
  • Prefer ROI. Croping la doar zona relevantă de multe ori loveste orice filtru.
  • Să evitați prelucrarea excesivă. prea mult blur/upcaling poate distruge formele glifice.
  • Baseline automate. Păstrați un set mic de imagini de aur și rulați-le în CI pentru a detecta regresiuni.
  • **Save intermediate.**Salvați imagini prelucrate la un ./debug/ Folder în timpul tuningului.

More in this category