Dåliga skanningar, telefonskott, fax och komprimerade skärmdumpar besegrar ofta OCR. Den goda nyheten: en liten preprocessing går en lång väg. Denna guide ger dig praktiska, löpbara steg (alignade med gipset i slutet) för att rensa upp bilderna ** före** oCR och till tune motorn för betydligt bättre resultat.
Fullständigt exempel
förutsättningar
- NET 8 (eller .NET 6+) SDK
- Nu är:
Aspose.OCR
- (Det är valfritt )
Aspose.Total.lic
Om du planerar att överstiga utvärderingsgränserna
Skapa en konsolapp och lägg till paketet:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Steg 1 – Förbehandling av lågkvalitativa bilder
** Mål:** minska buller, normalisera kontrast / ljusstyrka och (alternativt) uppskala eller odla före OCR.
1.1 Ladda upp bilden
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 Ta bort buller (median filter)
Använd en median filter för att undertrycka salt- och pappersljud och JPEG-artiklar.
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 ska man ändra: *
- Om du fortfarande ser speglar, stiga upp
MedianFilterSize
till * 5 *. - Om små tecken försvinner, droppa tillbaka till 3 eller avsluta den.
1.3 Normalisera kontrast / ljusstyrka
Gör texten ut ur bakgrunden.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
- Reglerna för tummen: *
- Överexponerad (tvättad): minskar ljusstyrkan (till exempel -10) och håller kontrasten måttlig.
- ** Underexponerad (för mörk):** ökar ljusstyrkan (t.ex. +10) och kontrasten (till exempel +20*).
1.4 Konstruktion av bearbetningsrör och förbehandling
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 (alternativ) Upscale liten text
Om texten är mycket liten (<10px höjd), uppskala för OCR med högkvalitativ 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 (Optionell) Odling av en Interest Region (ROI)
Om du bara behöver en portion (t.ex. header, faktura totaler), skörda för att minska fläckar och fel.
// 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 (Optionell) Snabb binärisering (DIY)
Om bakgrundsfärgerna är komplexa, konvertera till gråskala och tröskel. (Använda detta endast om din OCR bygga saknar en dedikerad binarisering alternativ; det är en enkel 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;
Steg 2 – Konfigurera OCR-inställningar (alternativt, om tillgängligt i din byggnad)
Vissa Aspose.OCR-byggnader visar inställningar på motornivå. Om ditt paket har dem, ställ in språk och **sidor för att hjälpa segmentering och erkännande.
// 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;
När att ställa in:
- Mixed languages: växla till lämplig språk eller flerspråkig läge.
- Dense textrådar:
PageSegmentationMode.Auto
eller * Dokumentläge *. - Form/tabeller: föredrar Dokument segmentering; skörda till regionen när det är möjligt.
Steg 3 – Kör OCR & Utvärdera
Detta är den exakta flödet från värmen: preprocess → identifiera → skriva ut.
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);
}
}
}
}
Export text: Skriv till en fil för inspektion:
File.WriteAllText("recognized.txt", recognizedText);
Symtom → Fix (Cheat-Sheet med API-alternativ)
Symptom | Vad att försöka | Hur man ställer in (kod) |
---|---|---|
** Speckle buller / JPEG-artiklar** | Median filter (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
”Too Dark” | Öka ljusstyrkan (+5..+15) och kontrasten (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
*Tvättas ut * | Minskad ljusstyrka (-5..-15), måttlig kontrast | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Mycket liten text * | Skala × 1.25–× 1.75, Därefter OCR | image = Upscale(image, 1.5); |
Bosy bakgrund / färgljus | DIY binärisering eller crop ROI | var bin = ToBinary(image, 185); eller image = image.Clone(roi, ...) |
* Skärd skanning * | Deskew (om exponerad) eller omskanning sträcker | (Om din byggnad utsätter ett Deskew-alternativ aktiverar du det; annars skördar & räddar) |
* Blandade språk * | Ställ in OCR-språk(er) uttryckligen | (om det finns tillgängliga) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Tabellinnehåll * | Växter till tabellregionen före OCR | image.Clone(roi, image.PixelFormat) |
Inte alla byggnader exponerar samma motorinställningar. Om en egendom inte är tillgänglig i ditt paket, förlita sig på bildförbehandling tekniker ovan – de är API-stabila och effektiva.
Bästa praxis
- Tweak i små steg. Ändra en parameter samtidigt (t.ex.
MedianFilterSize
3 → 5) och jämföra utgångar. - Företrädesvis ROI. Kryssning till bara det relevanta området slår ofta någon filter.
- Förhindra överbehandling. För mycket blur/upscaling kan förstöra glyfformar.
- Automatiska baseller. Håll en liten gyllene uppsättning tråkiga bilder och kör dem i CI för att upptäcka regressioner.
- Save intermediates. Spara förbearbetade bilder till en
./debug/
Filer under tuning.