Huonot skannat, puhelinkuvat, faksit ja tiivistetyt näytöt häviävät usein OCR: n. Hyvät uutiset: pieni ennakkoprosessointi menee pitkälle. Tämä opas antaa sinulle praktisia, kävelyviä askeleita (johdetaan lopputulokseen) kuvien puhdistamiseksi ** ennen** OCC: stä ja tune oCR-moottorille huomattavasti parempia tuloksia varten.
Täydellinen esimerkki
edellytykset
- .NET 8 (tai .Net 6+) SDK
- Ja nyt:
Aspose.OCR
- ( valinnainen vaihtoehto)
Aspose.Total.lic
Jos aiot ylittää arviointirajat
Luo konsolin sovellus ja lisää paketti:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Vaihe 1 – Alhaisen laadun esivalmisteet
Tavoite: vähentää melua, normalisoida kontrastin / kirkkauden ja (vaihtoehtoisesti) ylittää tai kasvaa ennen OCR:tä.
1.1 Kuvan lataaminen
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 Poista melu (lähde suodatin)
Käytä ** keskimääräistä suodatinta** tukahduttaa suolan ja paperin melua ja JPEG-artikkelia.
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
};
- Milloin pitää muuttaa: *
- Jos näet vielä peilejä, nouse
MedianFilterSize
Tätä varten *5 *. - Jos pienet merkit häviävät, laske takaisin 3 tai kytke se pois.
1.3 Kontrastin / kirkkauden normalisointi
Tee tekstistä tausta.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
- Tuuman säännöt: *
- Yli altistunut (pesu): vähentää kirkkautta (esim. -10) ja pitää kontrastin maltillisena.
- Ilman altistumista (liian pimeä): parantaa kirkkautta (esim. +10) ja kontrastia ( Esim. +20*).
1.4 Rakentaa jalostusputkia ja ennaltaehkäisyä
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 (vaihtoehtoinen) Upscale pieni teksti
Jos teksti on ** hyvin pieni** (<10px korkeus), koota ** ennen** OCR käyttämällä laadukasta uudelleenkuviointia.
// 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 (vaihtoehtoinen) Kasvi etualueella (ROI)
Jos tarvitset vain yhden osan (esimerkiksi otsikko, laskun kokonaismäärät), viljely vähentää leikkausta ja virheitä.
// 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 (vaihtoehtoinen) Nopea binarytaatio (DIY)
Jos taustan värit ovat monimutkaisia, kääntää harmaaseen ja raja-arvoon. (käytä tätä vain, jos OCR-rakennuksesi puuttuu omistautuneesta binarytaatiovaihtoehdosta; se on yksinkertainen putoaminen.)
// 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;
Vaihe 2 – Aseta OCR-asetukset (vaihtoehtoisesti, jos se on käytettävissä rakenteessasi)
Jotkut Aspose.OCR-rakenteet paljastavat moottoritason asetukset.Jos paketti on niitä, asettaa kieli ja sivujärjestys vinkkejä segmentoinnin ja tunnistamisen auttamiseksi.
// 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;
- Milloin asettaa: *
- Sekoitetut kielet: vaihda asianmukaiseen kieliin tai monikieliseen tilaan.
- Tekstiblokkien kirjoittaminen: *
PageSegmentationMode.Auto
tai dokumentti muodossa.
- Tekstiblokkien kirjoittaminen: *
- Muodot/taulukot: mieluummin Dokumentti segmentointi; viljely alueelle aina kun mahdollista.
Vaihe 3 – Käynnistä OCR & Evaluate
Tämä on todellinen virtaus peräpukamasta: ennakkoprosessi → tunnistaminen → tulostus.
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);
}
}
}
}
Teksti vienti: kirjoita tiedostoon tarkastusta varten:
File.WriteAllText("recognized.txt", recognizedText);
Symptom → Fix (Cheat-Sheet with API options)
Symptom | Mitä yrittää | Miten määrittää (koodi) |
---|---|---|
* Näytön ääni / JPEG-artikkelit* | Keskimääräinen suodatin (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
”Too Dark” | Lisää kirkkautta (+5..+15) ja kontrastia (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* pyyhkiä pois* | Vähentää kirkkautta (-5..-15), maltillinen kontrasti | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Erittäin pieni teksti* | Lämpötila × 1,25–× 1,75 Sitten OCR | image = Upscale(image, 1.5); |
* Äärimmäinen tausta / värin melu* | DIY Binarisaatio tai Crop ROI | var bin = ToBinary(image, 185); tai image = image.Clone(roi, ...) |
* Sekoitettu skannaus* | Deskew (jos altistunut) tai uudelleen skannaus | (Jos rakennus altistaa Deskew-vaihtoehdon, käytä sitä; muuten viljely & pelastus) |
* sekoitetut kielet * | Määritä OCR kieli(et) nimenomaisesti | (Jos käytettävissä on ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Tavallinen sisältö * | Kasvi taulukon alueelle ennen OCR:tä | image.Clone(roi, image.PixelFormat) |
Kaikki rakenteet eivät altista samoja moottorin asetuksia. Jos omaisuus ei ole käytettävissä pakkauksessasi, luota edellä mainittuihin kuvan ennakkoprosessitekniikoihin – ne ovat API-stabiileja ja tehokkaita.
Parhaat käytännöt
- Tweak pienissä vaiheissa. Vaihda yksi parametri kerralla (esim.
MedianFilterSize
3 → 5) ja vertaile tuloksia. - Lisää ROI. Vain asiaankuuluvaan alueeseen siirtyminen usein lyö minkä tahansa suodatin.
- Vältä liiallista käsittelyä. Liikaa blur/upcaling voi tuhota glyph-muodot.
- Automaattiset baseliinit. Pidä pieni kultainen joukko harmaita kuvia ja suorita ne CI: ssä regressiot havaitsemiseksi.
- Save intermediates. Säilytä ennakkoon käsiteltyjä kuvia
./debug/
Tapetti tuning aikana.