Scans yang buruk, tangkapan telepon, faks, dan screenshots yang dikompresi sering mengalahkan OCR. Berita baik: sebuah preprocessing berjalan jauh. Panduan ini memberikan Anda langkah-langkah praktikal, berjalan (terhubung dengan gergasi di akhir) untuk membersihkan gambar **sebelum **OCR dan untuk tune mesin oCR untuk hasil yang jauh lebih baik.

Contoh lengkap

Persyaratan

  • Menggunakan .NET 8 (atau SDK)
  • Untuk NuGet: Aspose.OCR
  • (dengan pilihan) Aspose.Total.lic Jika Anda berencana untuk melebihi batas evaluasi

Buat aplikasi konsol dan tambahkan paket:

dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR

Langkah 1 – Preprocess low-quality image

Tujuan: mengurangi kebisingan, menormalkan kontras / kecerahan, dan (optional) upscale atau tanaman sebelum OCR.

1.1 Mengisi gambar

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 Menghilangkan kebisingan (filter medium)

Gunakan filter medium** untuk menekan bunyi garam dan kentang dan artifak 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
};

Kapan harus berubah :

  • Jika Anda masih melihat cermin, angkat MedianFilterSize untuk * 5 *.
  • Jika karakter kecil hilang, turun kembali ke 3 atau putar.

1.3 Normalisasi kontras / kecerahan

Membuat teks muncul dari latar belakang.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Peraturan dari Tumb: *
  • ** Terpapar (dibasuh):** mengurangi kecerahan (misalnya, -10) dan menjaga kontras moderat.
  • Tidak terdedah (terlalu gelap): meningkatkan kecerahan (misalnya, +10) dan kontras (meskipun, +20*).

1.4 Pembinaan pipa pemprosesan & pra-pengolahan

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 (Optional) Upscale teks kecil

Jika teks sangat kecil** (<10px tinggi), upscale sebelum OCR menggunakan resampling berkualitas tinggi.

// 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 (Optional) Crop a Region of Interest (ROI)

Jika Anda hanya membutuhkan satu porsi (misalnya, header, total invoice), tanaman untuk mengurangi kerusakan dan kesalahan.

// 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 (Optional) Binariasi Cepat (DIY)

Jika warna latar belakang yang rumit, konversi ke grafis dan batas. (Menggunakan ini hanya jika OCR Anda membangun tidak memiliki opsi binarisasi khusus; itu adalah penurunan sederhana.)

// 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;

Langkah 2 – Mengkonfigurasi Pengaturan OCR (Optional, jika tersedia dalam konstruksi Anda)

Beberapa Aspose.OCR membangun mengeksposkan pengaturan tingkat mesin.Jika paket Anda memiliki mereka, tetapkan bahasa dan layout halaman petunjuk untuk membantu segmen dan pengenalan.

// 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;

Ketika untuk menetapkan:

  • Bahasa campuran: beralih ke bahasa yang sesuai atau mode multi-bahasa.
  • *Blok teks yang dibagikan: * PageSegmentationMode.Auto atau mode * dokumen *.
  • Bentuk/jadual: prefer Dokumen segmensi; tanaman ke daerah kapan saja mungkin.

Langkah 3 – Lakukan OCR & Evaluate

Berikut ini adalah aliran yang tepat dari gist: preprocess → recognize → print.

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);
            }
        }
    }
}

Teks ekspor: tulis ke file untuk pemeriksaan:

File.WriteAllText("recognized.txt", recognizedText);

Simptom → Fix (Cheat-Sheet dengan opsi API)

SymptomApa yang harus dicobaBagaimana cara mengatur (code)
* Speckle bunyi / JPEG artifak*Filter rata-rata (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
“Too yang gelap”Meningkatkan kecerahan (+5..+15) dan kontras (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
Pembersihan yang dilakukanMenurunkan kecerahan (-5..-15), kontras moderatBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* Teks yang sangat kecil *Upscale × 1.25–× 1.75, Kemudian OCRimage = Upscale(image, 1.5);
Kecepatan latar belakang / bunyi warnaDIY binarisasi atau crop ROIvar bin = ToBinary(image, 185); atau image = image.Clone(roi, ...)
* Scan yang tertutup *Desk (jika terdedah) atau re-scan straighter(Jika konstruksi Anda mendedahkan opsi Deskew, mengaktifkannya; crop & rescan lainnya)
* Bahasa yang bercampur *Menetapkan bahasa OCR(s) secara eksplisit(Jika ada yang tersedia) ocrEngine.Settings.Language = RecognitionLanguages.English;
* Kandungan Tabel *Tanaman ke wilayah tabel sebelum OCRimage.Clone(roi, image.PixelFormat)

Jika properti tidak tersedia dalam paket Anda, bergantung pada teknik pre-processing gambar di atas – mereka API stabil dan efektif.

Praktik Terbaik

  • Tweak dalam langkah-langkah kecil. Mengubah satu parameter sekaligus (misalnya, MedianFilterSize 3 → 5) dan membandingkan output.
  • Suka ROI. Menarik ke area yang relevan saja sering memukul filter apa pun.
  • Menghindari over-processing. Terlalu banyak blur/upcaling dapat menghancurkan bentuk glyph.
  • Basel otomatis. Simpan set kecil gambar emas dan jalankan mereka di CI untuk mendeteksi regresi.
  • Save intermediates. Simpan gambar yang sudah diproses ke ./debug/ dalam proses tuning.

More in this category