Лошите скани, телефонни снимки, факси и компресирани екрани често поразяват OCR. Добрата новина: ** малко предварително обработване върви дълъг път**. Този ръководство ви дава практични, изпълняеми стъпки (съгласувани с гъстата в края) за почистване на изображения преди ОCR и за tune на двигателя за значително по-добри резултати.
Пълният пример
Предупреждения
- .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 – Препроцесиране на изображения с ниско качество
Целта: намаляване на шума, нормализиране на контраста / яркостта и (опционално) издигане или отглеждане преди OCR.
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 Премахване на шума (среден филтър)
Използвайте среден филтър, за да потиснете шума от сол и пипер и JPEG артефакти.
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
};
*Когато трябва да се промени: *
- Ако все още виждате спекули, издигнете
MedianFilterSize
До 5* и до 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 (опционално) Упскален малък текст
Ако текстът е много малък (<10px височина), изчислете преди OCR с висококачествено пресамулиране.
// 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 (опционално) култивиране на регион на интерес (ROI)
Ако се нуждаете само от една порция (напр. заглавие, фактури), култивиране, за да се намали плъзгането и грешката.
// 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 (опционална) Бърза бинарност (DIY)
Ако цветовете на фона са сложни, конвертирайте към гравитационна скала и праг. (Използвайте това ** само ако** вашият OCR изграждане липсва специална опция за бинарност; това е просто падане.)
// 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 — Конфигуриране на настройките на OCR (опционално, ако е налично в съоръжението)
Някои 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;
*Кога да зададете: *
- ** Смесени езици:** преминаване към подходящ език или мулти-езичен режим.
- Блокиране на текстовете: *
PageSegmentationMode.Auto
или * Документален режим.
- Блокиране на текстовете: *
- Форми / таблици: предпочитате *Документална сегментация; когато е възможно, отглеждате към региона.
Стъпка 3 – Извършете OCR & Evaluate
Това е точния поток от гъстата: препроцес → разпознаване → печат.
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);
Симптом → Fix (Cheat-Sheet с опции за API)
Symptom | Какво да опитаме | Как да се създаде (код) |
---|---|---|
Спецъл шум / JPEG артефакти | Среден филтър (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
„Тъмно“ | Увеличаване на яркостта (+5..+15) и контраста (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* Измиване на пране* | Намаляване на яркостта (-5..-15), умерени контрасти | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Много малък текст * | Размер на размера × 1,25–× 1,75 След това ОКР | image = Upscale(image, 1.5); |
* Голям шум / цветни шумове* | Диетична бинарност или Crop ROI | var bin = ToBinary(image, 185); или image = image.Clone(roi, ...) |
* Скенирани сканиране* | Изтегляне (ако е изложено) или повторно сканиране | (Ако вашата сграда показва опция Deskew, включете го; в противен случай растение & спасяване) |
* Смесени езици * | Определяне на езика на OCR(s) изрично | (ако е налице) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Таблица за съдържание* | Плодовете в региона на таблицата преди ОКР | image.Clone(roi, image.PixelFormat) |
Не всички сгради излагат едни и същи двигателни настройки. Ако нещата не са налични във вашия пакет, разчитайте на техниките за предварителна обработка на изображения** по-горе – те са API-стабилни и ефективни.
Най-добрите практики
- Връщане в малки стъпки. Промяна на един параметър наведнъж (например,
MedianFilterSize
3 → 5) и сравняване на резултатите. - Предпочита ROI. Кръпването до само съответната област често удари всеки филтър.
- ** Избягвайте прекомерната обработка.** Прекалено много блури/упскалиране може да унищожи глифните форми.
- Автоматични базели. Дръжте малък златен набор от трикови изображения и ги изпълнете в CI, за да откриете регресиите.
- Save intermediates. Съхранявайте предварително обработени изображения на
./debug/
Снимка по време на туниране.