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)
Symptom | Wat te proberen | Hoe 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 contrast | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
Veel klein tekst | Upscale × 1.25–× 1.75 Daarna OCR | image = Upscale(image, 1.5); |
* Boze achtergrond / kleurrijke lawaai* | DIY binarisatie of crop ROI | var 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 inhoud | Planten naar de tabelregio vóór OCR | image.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.