Плохие сканировки, телефонные снимки, факс и компрессированные экраны часто поражают ОКР. Хорошая новость: маленькая предварительная обработка проходит долгий путь. Этот руководство дает вам практические, пропускаемые шаги (совместимые с геймом в конце) для очистки изображений прежде ОЦР и до тун двигателя OCR для значительно лучших результатов.
Полный пример
Предупреждения
- .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 Удаление шума (средний фильтр)
Используйте средний фильтр для подавления шума соли и бумаги и артефактов 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» - Если маленькие символы исчезают, выбросите обратно на 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 } |
«Too Dark» | Увеличение яркости (+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); |
* шумный фон / цвет шума* | ДИИ БИНАРИЗАЦИЯ ИЛИ ЦРОП РОИ | var bin = ToBinary(image, 185); или image = image.Clone(roi, ...) |
* Скриншоты сканирования* | Расшифровка (если выявленная) или пересканирование радиатора | (Если ваш строй выставляет опцию Deskew, включите ее; в противном случае выращивать и спасать) |
* Смешанные языки * | Настройка языка (s) ОКР четко | (если имеется) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Табличный контент* | Растение в таблицу региона перед ОКР | image.Clone(roi, image.PixelFormat) |
Не все здания демонстрируют те же двигательные настройки. Если свойство не доступно в вашем пакете, полагайтесь на вышеуказанные техники предварительной обработки изображений — они являются API-стабильными и эффективными.
Лучшие практики
- Твик в небольших шагах. Изменить один параметр одновременно (например,
MedianFilterSize
3 → 5) и сравнивать выходы. - Предпочитается ROI. Кропинг только на соответствующую область часто ударит любой фильтр.
- ** Избегайте переработки.** Слишком много блура/упскалирования может уничтожить формы глифа.
- Автоматические базели. Сохраняйте небольшой золотой набор тропических изображений и запускайте их в CI, чтобы обнаружить регрессию.
- Save intermediates. Сберечь предварительно обработанные изображения в
./debug/
Фолклор во время тунирования.