Dårlige scanninger, telefonscots, fax og komprimerede skærmbilleder besejrer ofte OCR. Den gode nyhed: en lille forarbejdning går en lang vej. Denne guide giver dig praktiske, løbende skridt (aligneret med gætet i slutningen) til at rense billeder for oCR og til tune O CR-motoren for betydeligt bedre resultater.
Et fuldstændigt eksempel
Forudsætninger
- NET 8 (eller .NET 6+) SDK
- Det er nu:
Aspose.OCR
- (Optionelt er det
Aspose.Total.lic
Hvis du planlægger at overstige evalueringsgrænserne
Skab en konsolapp og tilføje pakken:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Steg 1 - Forarbejdning af lavkvalitetsbilleder
** Mål: ** Reducere støj, normalisere kontrast/lythed og (alternativt) opskala eller dyrke før OCR.
1.1 Lad billedet op
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 Fjern støj (median filter)
Brug en median filter til at undertrykke salt- og pepperlyd og JPEG-artifakter.
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
};
Når man skal ændre sig: *
- Hvis du stadig ser spejler, hæve
MedianFilterSize
til * 5 *. - Hvis små tegn forsvinder, drop tilbage til 3 eller slå det ud.
1.3 Normalisering af kontrast / lys
Gør teksten ud fra baggrunden.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
** Reglerne for tummen:**
- Overeksponeret (vasket ud): reducerer lysstyrken (f.eks. -10) og holder kontrast moderat.
- ** Underexponeret (for mørkt):** øger lysstyrken (f.eks. +10) og kontrasten (t.ex. +20*).
1.4 Konstruktion af forarbejdningsrør og præprocess
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 (Optionelt) Upscale lille tekst
Hvis teksten er ** meget lille** (<10px højde), upscale for OCR ved hjælp af høj kvalitet 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 (Optionelt) Grøntsager i et Interestområde (ROI)
Hvis du kun har brug for en portion (f.eks. header, fakturaumsbeløb), skal der dyrkes for at reducere kløe og fejl.
// 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 (Optionel) Hurtig binarisering (DIY)
Hvis baggrundsfarverne er komplekse, konvertere til grå skala og grænse. ( Brug dette ** kun hvis** din OCR bygning mangler en dedikeret binarisering mulighed; det er en simpel faldback.)
// 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;
Trin 2 – Indstill OCR-indstillinger (Optionelt, hvis det er tilgængeligt i din bygning)
Nogle Aspose.OCR bygger eksponerer motor-niveau indstillinger. Hvis dit pakke har dem, indsæt sprog og side layout tips for at hjælpe segmentering og genkendelse.
// 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;
- Hvornår skal du indstille: *
- Mixed sprog: skift til passende sprog eller flersprog.
- Dense tekstblokker er:
PageSegmentationMode.Auto
eller ** Dokumentation** mode. - Form/tabler: foretrækker Dokument segmentering; grøntsager til regionen, når det er muligt.
Trin 3 – Run OCR & Evaluate
Dette er den exakte flow fra gommen: præprocess → genkendelse → udskrivning.
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);
}
}
}
}
** Eksport tekst:** Skriv til en fil for inspektion:
File.WriteAllText("recognized.txt", recognizedText);
Symptom → Fix (Cheat-Sheet med API-muligheder)
Symptom | Hvad skal man prøve | Hvordan til at indstille (kode) |
---|---|---|
** Speckle støj / JPEG artefakter** | Median filter (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
”Tå mørk” | Øget lys (+5..+15) og kontrast (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* Vask ud * | Reduktion af lys (-5..-15), moderat kontrast | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* meget lille tekst * | Upscale × 1.25–× 1.75, Og så OCR | image = Upscale(image, 1.5); |
Busy baggrund / farve støj | DIY binarisering eller crop ROI | var bin = ToBinary(image, 185); eller image = image.Clone(roi, ...) |
* Skewed scan * | Deskew (hvis eksponeret) eller genskanning strækker | (Hvis din bygning udsætter en Deskew mulighed, aktiver det; ellers crop & rescan) |
* Blandede sprog * | Sæt OCR sprog(er) udtrykkeligt | (hvis det er tilgængeligt) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Tabelindhold * | Grøntsager til bordregionen før OCR | image.Clone(roi, image.PixelFormat) |
Ikke alle bygninger udsætter de samme motorindstillinger. Hvis en ejendom ikke er tilgængelig i dit pakke, stole på billedeforarbejdning teknikkerne ovenfor – de er API-stable og effektive.
Bedste praksis
- Tweak i små skridt. Ændre en parameter på én gang (f.eks.
MedianFilterSize
3 → 5) og sammenlign udgangene. - Foretrækker ROI. Cropping til kun det relevante område slår ofte nogen filter.
- ** Undgå overforarbejdning.** For meget blur/upscaling kan ødelægge glyph-former.
- Automate baseliner. Hold et lille guld sæt af trikke billeder og køre dem i CI for at opdage regressioner.
- Save intermediates. Save forhåndsprocesserede billeder til en
./debug/
Foldere under tuning.