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)
Symptom | Apa yang harus dicoba | Bagaimana 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 dilakukan | Menurunkan kecerahan (-5..-15), kontras moderat | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Teks yang sangat kecil * | Upscale × 1.25–× 1.75, Kemudian OCR | image = Upscale(image, 1.5); |
Kecepatan latar belakang / bunyi warna | DIY binarisasi atau crop ROI | var 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 OCR | image.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.