Os scans maus, fotografias telefônicas, faxes e capturas de tela comprimidas muitas vezes derrotam o OCR. A boa notícia: um pequeno pré-processamento vai um longo caminho. Este guia dá-lhe passos prácticos, executáveis (alinhados com o gesto no final) para limpar as imagens antes do OCR e para tune o motor do OKR para resultados significativamente melhores.

Exemplo completo

Pré-requisitos

  • .NET 8 (ou .Net 6+) SDK
  • Nuvem em: Aspose.OCR
  • ( Opcional em Aspose.Total.lic Se você planeja ultrapassar os limites de avaliação

Crie um aplicativo de console e adicione o pacote:

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

Passo 1 – Preprocessar imagens de baixa qualidade

**Objetivo: Reduzir o ruído, normalizar o contraste/brilho e (opcionalmente) crescer ou colher antes do OCR.

1.1 Carregar a imagem

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 Remova o ruído (filtro médio)

Use um filtro mediano para suprimir o ruído de sal e pimenta e artefatos 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
};

*Quando é preciso mudar: *

  • Se você ainda vê espelhos, levante MedianFilterSize para * 5 *.
  • Se os pequenos caracteres desaparecerem, retire para 3 ou desligue-o.

1.3 Normalizar o contraste / brilho

Faça que o texto saia do fundo.

var contrastOptions = new ContrastOptions
{
    // Positive values increase contrast/brightness; negatives decrease
    ContrastAdjustment = 20,   // try 10..30
    BrightnessAdjustment = 10  // try -10..+15 based on exposure
};
  • Regras do tom: *
  • Overexposto (vagado): diminui a brilho (por exemplo, -10) e mantém o contraste moderado.
  • Não exposto (tão escuro): aumenta a brilho (por exemplo, +10) e o contraste (p. ex., ** +20**).

1.4 Construção de pipeline de processamento e pré-processamento

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 pequeno

Se o texto é muito pequeno (<10px altura), upscale ante OCR usando ressampling de alta qualidade.

// 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 uma Região de Interesse (ROI)

Se você só precisa de uma porção (por exemplo, cabeçalho, total de fatura), colheita para reduzir o coágulo e erro.

// 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) Binarização rápida (DIY)

Se as cores de fundo são complexas, converse para a escada e o limite. (Utilize isso só se seu OCR construção não tem uma opção de binarização dedicada; é um simples declínio.)

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

Passo 2 - Configure as configurações OCR (opcional, se disponível no seu edifício)

Alguns edifícios Aspose.OCR expõem configurações de nível do motor. Se o seu pacote os possui, coloque lingua e layout da página indicações para ajudar a segmentação e reconhecimento.

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

Quando você deve configurar:

  • Línguas mistas: mudar para o modo linguístico ou multilíngue apropriado.
  • Blocos de texto de Dança: PageSegmentationMode.Auto ou * Modo de Documentação.
  • Formas / tabelas: prefere a segmentação Document; colhe para a região sempre que possível.

Passo 3 – Run OCR & Evaluate

Este é o fluxo exato do gesto: pré-processo → reconhecer → 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);
            }
        }
    }
}

Exportação de texto: escreva para um arquivo para inspeção:

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

Sintoma → Fix (Cheat-Sheet com opções de API)

SymptomO que tentarComo definir (código)
** O ruído do espectáculo / artefatos JPEG**Filtro médio (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
“Too é escuro”Aumentar a brilho (+5..+15) e o contraste (+10…+25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
* Descansação *Redução de brilho (-5..-15), contraste moderadoBrightnessAdjustment = -10, ContrastAdjustment = 10..20
* Muito pequeno texto *A escala é de 1.25 a 1.75. Em seguida OCRimage = Upscale(image, 1.5);
Búsco de fundo / ruído de corDIY binarização ou crop ROIvar bin = ToBinary(image, 185); ou image = image.Clone(roi, ...)
* Escaneamento desligado *Deskew (se exibido) ou re-escanear estragador(Se o seu edifício expõe uma opção Deskew, habilite-a; caso contrário crop & rescan)
* Línguas misturadas *Defina expressamente a linguagem (s) do OCR(se disponível) ocrEngine.Settings.Language = RecognitionLanguages.English;
* Conteúdo Tabular *Planta para a região da tabela antes do OCRimage.Clone(roi, image.PixelFormat)

Se uma propriedade não está disponível no seu pacote, confira nas técnicas de pré-processamento da imagem acima – elas são API-stables e eficazes.

Melhores Práticas

  • Tweak em pequenos passos. Mude um parâmetro ao mesmo tempo (por exemplo, MedianFilterSize 3 → 5) e comparar os resultados.
  • Preferindo ROI. Crosping para apenas a área relevante muitas vezes bate qualquer filtro.
  • Evite o processamento excessivo. Excesso de blur/upscaling pode destruir formas de glifos.
  • Baselinas automáticas. Manter um pequeno conjunto de imagens de ouro e executá-las em CI para detectar regressões.
  • Save intermediates. Salve imagens preprocessadas para um ./debug/ folheto durante o tuning.

More in this category