Недоброзичливі скани, телефонні знімки, факси та компресовані скриншоти часто перемагають ОКР. Хороша новина: маленьке попереднє обробка йде довгий шлях. Цей посібник дає вам практичні, прохідні кроки (збігаються з гейдом в кінці) для очищення зображень до OCR і до тоніння двигуна ОЦР для значно кращих результатів.

Повний приклад

Передумови

  • Створення .NET 8 (або .Net 6+)
  • Неймовірність : 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);

Симптоми → Виправити (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);
* Холодний фон / кольоровий шум*ДІЙ БІНАРИЗАЦІЯ або КРОП РОІ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, щоб виявити регресії.
  • Спасуйте медіати. Зберегти заздалегідь оброблені зображення в ./debug/ Застосування під час туннування.

More in this category