Лоше скенирање, телефонски снимак, факс и компресирани снимаци често побеђују ОЦР. Добра вест: мало препроцесирање иде дуг пут. Овај водич вам даје практичне, тркајуће кораке (усклађене са гумом на крају) да очистите слике пре ОКР и да туне оЦРА мотора за значајно боље резултате.
Потпуни пример
Принципи
- .net 8 (или .NET 6+) SDK
- НУГЕТ :
Aspose.OCR
- (опционално је да
Aspose.Total.lic
Ако планирате да пређете границе процене
Креирајте апликацију конзоле и додајте пакет:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Корак 1 — Препроцес нискоквалитетне слике
** Циљ:** смањити буку, нормализовати контраст / светлост, и (опционално) упскале или узгајати пре ОЦР.
1.1 Преузмите слику
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 Уклањање буке (средњи филтер)
Користите средњи филтер да бисте сузбијали звук соли и паприке и ЈПЕГ артифакте.
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
};
Kada treba da se menja :
- Ако још увијек видите сјај, подигните
MedianFilterSize
до * 5 * . - Ако мале знакове нестану, спустите се назад на 3 или га искључите.
1.3 Нормализација контраста / светлости
Направите текст изван позадине.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
** Правила за тумб:**
- ** Превише изложена (опрана):** смањује сјајност (на пример, -10) и држи контраст умереним.
- Неизложена (превише тамна): повећава сјајност (на пример, +10) и контраст (нпр. +20*).
1.4 Изградња цеви за обраду и препроцеса
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 (опционално) Упскале мали текст
Ако је текст изузетно мали (<10пк висина), упсскале пре ОЦР користећи висококвалитетно ресамплирање.
// 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 (опционално) узгој у региону интереса (РОИ)
Ако вам је потребна само једна порција (на пример, наслов, укупни рачун), узгајање да се смањи зглоб и грешка.
// 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 (опционална) Брза бинарност (ДИИ)
Ако су боје позадине сложене, конвертирајте се на грозну скалу и границу. (Користите ово само ако ваше ОЦР грађевине недостаје посвећена опција за бинарство; то је једноставан падback.)
// 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;
Корак 2 — Конфигурисање ОЦР подешавања (опционално, ако је доступно у вашем зграду)
Неки Aspose.OCR граде излагају подешавања нивоа мотора.Ако их ваш пакет има, постављајте језик и страница распоред индикације како би помогли сегментацији и препознавању.
// 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;
*Kada je potrebno nastaviti: *
- Мешани језици: прелазак на одговарајући језик или мулти-језички режим.
- Блокирање текстуалних блокова: *
PageSegmentationMode.Auto
или * Документ * режим.
- Блокирање текстуалних блокова: *
- Форме / табеле: преферирају Документ сегментацију; узгајање у региону када је могуће.
Корак 3 — Изводите ОЦР & Евалуате
Ово је тачан ток из гједа: препроцес → препознавање → штампање.
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);
}
}
}
}
Експортирање текста: Напишите на датотеку за инспекцију:
File.WriteAllText("recognized.txt", recognizedText);
Симптоми → Поправити (Чеат-Схет са опцијама АПИ)
Symptom | Шта покушати | Како поставити (код) |
---|---|---|
Спецкле шум / ЈПЕГ артефакти | Средњи филтер (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
„Too Dark“ | Повећати сјајност (+5..+15) и контраст (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* Избацивање * | Смањена светлост (-5..-15), умерени контраст | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Veoma mali tekst* | Упскале × 1.25–× 1.75, Тада ОКР | image = Upscale(image, 1.5); |
Буси позадина / боја бука | ДИИ бинаризација или Цроп РОИ | var bin = ToBinary(image, 185); или image = image.Clone(roi, ...) |
* Скривени скенирање * | Дескеу (ако је изложено) или поново скенирање | (Ако ваш зграда излага опцију Дескеу, активирајте га; иначе узгајање и спасавање) |
* Мешани језици * | Подесите ОЦР језик(с) изричито | (ако је на располагању) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Табуларни садржај * | Растење у региону табеле пре ОЦР | image.Clone(roi, image.PixelFormat) |
Ако не постоји имовина која није доступна у вашем пакету, ослањајте се на горе наведене технике препроцесирања слике – они су АПИ-стабилни и ефикасни.
Најбоља пракса
- Tweak u malim koracima. Promenite jedan parametar u jednom trenutku (npr.
MedianFilterSize
3 → 5) и упоређивање излаза. - Преферира РОИ. Цропинг само на релевантну површину често удара било који филтер.
- ** Избегавајте преоптерећење.** Превише блура/упскалинг може уништити облике глифа.
- Аутоматске базелине. Држите мали златни скуп трицки слике и покрените их у ЦИ да бисте открили регресије.
- Спасите посреднике. Сачувајте претходно обрађене слике на
./debug/
Потпуно током тунирања.