Las malas escaneas, las fotos de teléfono, los fax y las capturas de pantalla comprimidas a menudo derrotan el OCR. La buena noticia: un poco de preprocesamiento va un largo camino. Esta guía le da pasos prácticos, runnables (alignados con el gesto en el final) para limpiar las imágenes antes del oCR y para tune el motor de ocr para obtener resultados significativamente mejores.
Ejemplo completo
Prerequisitos
- NET 8 (o .NET 6+) SDK
- El NuGet:
Aspose.OCR
- ( Opcional de la
Aspose.Total.lic
Si planeas superar los límites de evaluación
Crea una aplicación de consola y añade el paquete:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Paso 1 - Preproceso de imágenes de baja calidad
**Objetivo: ** Reducir el ruido, normalizar el contraste / brillo, y (opcionalmente) subir o cultivar antes de la OCR.
1.1 Cargar la imagen
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 Eliminar el ruido (filtro medio)
Utilice un filtro medio para suprimir el ruido de sal y pimienta y los artefactos 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
};
*Cuándo cambiar: *
- Si todavía ves espejos, alza
MedianFilterSize
En el caso de 5 - Si los caracteres pequeños desaparecen, desciende de nuevo a 3 o desliza.
1.3 Normalizar el contraste / brillo
Hacer que el texto salga del fondo.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
- Las reglas del tumbo: *
- Overexpuesto (el lavado): disminuye la brillo (por ejemplo, -10) y mantiene el contraste moderado.
- Underexpuesto (muy oscuro): aumento de la brillo (por ejemplo, +10) y el contraste ( por ejemplo ** +20**).
1.4 Construcción de pipeline de procesamiento y preproceso
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 (Opcional) Upscale texto pequeño
Si el texto es muy pequeño (<10px altura), upscale pre OCR utilizando reampliación de alta calidad.
// 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 (Opcional) Cultivo de una Región de Interés (ROI)
Si sólo necesita una porción (por ejemplo, el título, las facturas totales), la cosecha para reducir el desgaste y el error.
// 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 (Opcional) Binarización rápida (DIY)
Si los colores de fondo son complejos, convertirse en gris y límite. (Utilizar esto sólo si su OCR construcción no tiene una opción de binarización dedicada; es un simple fallback.)
// 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;
Paso 2 - Configure OCR Settings (opcional, si está disponible en su construcción)
Algunas edificaciones de Aspose.OCR exponen los ajustes de nivel del motor. Si su paquete los tiene, establezca las indicaciones lingua y layo de página para ayudar a la segmentación y el reconocimiento.
// 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;
Cuándo para configurar:
- Lenguas mixtas: Cambiar en el modo de lenguaje o multilingüe adecuado.
- Blocos de texto de danza:
PageSegmentationMode.Auto
Modo de * Documento *. - Formas/tables: Preferir la segmentación Documento; cultivo a la región cuando sea posible.
Paso 3 – Evaluación y OCR
Este es el flujo exacto del helado: preproceso → reconocer → imprimir.
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);
}
}
}
}
** Texto de exportación:** escriba en un archivo para la inspección:
File.WriteAllText("recognized.txt", recognizedText);
Síntoma → Fix (Cheat-Sheet con opciones de API)
Symptom | Lo que intentar | Cómo configurar el código (code) |
---|---|---|
** El ruido del espectáculo / los artefactos JPEG** | El filtro medio (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
«Too Dark» | Aumentar la luminosidad (+5…+15) y el contraste (+10..+25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* Se lavaba fuera* | Reduce la luminosidad (-5..-15), contraste moderado | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
Muy pequeño texto | Tamaño × 1.25–× 1.75, Y luego OCR | image = Upscale(image, 1.5); |
Búsco de fondo / ruido de color | DIY binarización o ROI de cultivo | var bin = ToBinary(image, 185); o image = image.Clone(roi, ...) |
* Escanear el escaneo* | Deskew (si expuesto) o re-escanear el estrellador | (Si su construcción expone una opción Deskew, habilite la opción; de otra manera crop & rescan) |
Lenguas mixtas | Definición del lenguaje OCR(s) explicitamente | (si está disponible) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* Contenido tabular* | Planta a la región de mesa antes de la OCR | image.Clone(roi, image.PixelFormat) |
Si una propiedad no está disponible en su paquete, confíe en las técnicas de preprocesamiento de imágenes** anteriormente – son API-estables y eficaces.
Mejores Prácticas
- Tweak en pequeños pasos. Cambiar un parámetro a la vez (por ejemplo,
MedianFilterSize
3 → 5) y comparar los resultados. - Preferir ROI. Croping a sólo la zona relevante a menudo bate cualquier filtro.
- Evite el sobreprocesamiento. Tanto más blur/upscaling puede destruir las formas de glifos.
- Bazelinas automáticas. Mantén un pequeño conjunto de imágenes de oro y las rellenan en CI para detectar regresión.
- Save intermediates. Salva imágenes preprocesadas a un
./debug/
Páginas durante el tuning.