Zlé skenovanie, telefónne snímky, faxy a komprimované obrazovky často porazia OCR. Dobrá správa: malo predbežné spracovanie ide dlhú cestu. Tento sprievodca vám dáva praktické, bežné kroky (v súlade s hromadou na konci) na čistenie obrázkov pred oCR a na tune motora O CR pre výrazne lepšie výsledky.
Kompletný príklad
Predpoklady
- .NET 8 (alebo .Net 6+) SDK
- V tomto prípade:
Aspose.OCR
- (Vybrať podľa možnosti)
Aspose.Total.lic
Ak plánujete prekročiť hodnotenie
Vytvorte aplikáciu konzoly a pridajte balík:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Krok 1 - Preproces s nízkou kvalitou obrázkov
Cieľ: znížiť hluk, normalizovať kontrast / jasnosť a (opcionálne) upscale alebo plodiny pred OCR.
1.1 Nahrať obrázok
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 Odstrániť hluk (priemerný filter)
Použite mediálny filter na potlačenie hluku soli a papiera a JPEG artefaktov.
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
};
- Kedy sa má zmeniť: *
- Ak stále vidíte zrkadlá, zdvihnite
MedianFilterSize
V prípade * 5 *. - Ak zmiznú drobné znaky, prejdite späť na 3 alebo ho vypnite.
1.3 Normalizácia kontrastu / jasu
Vytvorte text z pozadia.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
- Pravidlá tumu: *
- Overexposed (vyprázdnený): znižuje jasnosť (napríklad -10) a udržuje kontrast mierny.
- Nedostupné (príliš tmavé): zvyšuje jasnosť (napr. +10) a kontrast (príklad ** +20**).
1.4 Konštrukcia spracovacieho potrubia a predbežného spracovania
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 (opcionálne) Upscale malý text
Ak je text veľmi malý (<10px výška), upscale pred OCR pomocou vysoko kvalitného resamplingu.
// 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 (opcionálne) Výroba v regióne záujmu (ROI)
Ak potrebujete len jednu porciu (napr. hlavičku, celkové faktúry), pestovanie na zníženie zrážky a chyby.
// 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 (voliteľná) Rýchla binárnosť (DIY)
Ak sú farby pozadia zložité, previesť na šedej škály a hranici. (Používajte to ** len v prípade, že vaše OCR stavby chýba venovaná binárna možnosť; je to jednoduchý pad.)
// 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;
Krok 2 – Nastavenie nastavenia OCR (opcionálne, ak je k dispozícii vo vašej budove)
Niektoré budovy Aspose.OCR vystavujú nastavenia na úrovni motora. Ak ich váš balík má, nastavte jazyk a stránkový rozloženie tipy, ktoré pomáhajú segmentovať a rozpoznať.
// 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;
Kedy nastaviť :
- Zmiešané jazyky: prejdite na vhodný jazyk alebo viacjazyčný režim.
- Dánske textové bloky:
PageSegmentationMode.Auto
alebo režim dokumentov *. - Formy / tabuľky: uprednostňuje segmentáciu Dokument; zber do regiónu kedykoľvek je to možné.
Krok 3 – Spustiť OCR & Evaluate
Toto je presný prúd z hrnca: preproces → rozpoznanie → tlač.
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: napíšte do súboru pre kontrolu:
File.WriteAllText("recognized.txt", recognizedText);
Symptóm → Fix (Cheat-Sheet s možnosťami API)
Symptom | Čo sa pokúsiť | Ako nastaviť (kód) |
---|---|---|
Hlboký hluk / JPEG artefakty | Priemerný filter (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
„Toto je tmavo“ | Zvýšenie jasu (+5..+15) a kontrastu (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* vyprázdnený * | Zníženie jasu (-5..-15), mierny kontrast | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Veľmi malý text * | Upscale × 1,25 – x 1,75 potom OCR | image = Upscale(image, 1.5); |
Busy pozadie / farebný hluk | DIY binaryzácia alebo crop ROI | var bin = ToBinary(image, 185); alebo image = image.Clone(roi, ...) |
* Skončené skenovanie * | Deskew (ak je vystavený) alebo re-scan straighter | (Ak je vaša stavba vystavená možnosť Deskew, aktivujte ju; inak pestovať a zachrániť) |
* zmiešané jazyky * | Nastavenie jazyka OCR(s) výslovne | (ak je k dispozícii) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* tabuľkový obsah * | Výroba do tabuľkového regiónu pred OCR | image.Clone(roi, image.PixelFormat) |
Nie všetky stavby vystavujú rovnaké motorové nastavenia. Ak v balení nie je k dispozícii nehnuteľnosť, spoliehajte sa na prepracovanie obrazu techniky vyššie – sú API-stabilné a efektívne.
Najlepšie postupy
- Tweak v malých krokoch. Zmeňte jeden parameter naraz (napr.
MedianFilterSize
3 → 5) a porovnať výstupy. - Prefer ROI. Krúpanie iba na príslušnú oblasť často zasiahne akýkoľvek filter.
- ** Vyhýbajte sa nadmernému spracovaniu.** Príliš veľa blur/upcaling môže zničiť glyph formy.
- Automatické bazény. Udržiavajte malý zlatý súbor trickových obrázkov a spustite ich v CI na detekciu regresií.
- Zachráňte sprostredkovateľov. Zachrániť predbežné obrázky na
./debug/
Súbory počas tuningu.