恶劣的扫描、电话拍摄、传真和压缩屏幕截图往往会击败OCR. 好消息: 一个小预处理走很长的路. 本指南为您提供了 实用、可运行的步骤(与结尾的直径相匹配)清理图像 OCR 和 tune OKR 发动机,以获得显著更好的结果。

完整的例子

原則

  • .NET 8(或 .Net 6+) SDK
  • 诺基亚: Aspose.OCR
  • (可选) Aspose.Total.lic 如果您打算超越评估限制

创建一个控制台应用程序并添加包:

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

步骤 1 - 预处理低质量图像

目标: 减少噪音,正常化对比/亮度,并在 OCR 之前(可选)升级或种植。

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

什么时候要改变:*

  • 如果你仍然看到镜子,举起 MedianFilterSize5
  • 如果小字符消失,将其放回 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 (可选) Upscale 小文本

如果文本是 ** 非常小** (<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 (可选) Crop a Region of Interest (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 Settings (可选,如果在您的构建中可用)

一些 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 & 评估

这里是“准确的流动”从字体:预处理 →识别 →打印。

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

症状 → 修复(与 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);
** 混乱的背景 / 色彩噪音**DIY 二元化或 Crop ROIvar bin = ToBinary(image, 185);image = image.Clone(roi, ...)
* 切割扫描*Deskew (如果曝光) 或重新扫描(如果您的建筑暴露了一个 Deskew 选项,启用它; 否则,种植和拯救)
* 混合语言*明确设置 OCR 语言(s)(如可用) ocrEngine.Settings.Language = RecognitionLanguages.English;
* 表格内容*种植到表区之前的OCRimage.Clone(roi, image.PixelFormat)

如果您的包中没有任何属性,请依靠上面的 ** 图像预处理** 技术 - 它们是 API 稳定和有效的。

最佳实践

  • 在小步骤中旋转。 同时更改一个参数(例如, MedianFilterSize 3 → 5 和比较输出。
  • ** 更喜欢 ROI.** 切割到仅适当的区域往往会打任何过滤器。
  • ** 避免过度加工.** 过多的泡沫/升降可能会破坏格利夫形状。
  • 自动基板. 保持一个小金色图像集,并在 CI 中运行它们,以检测退缩。
  • Save intermediates. 将预处理的图像保存到 ./debug/ 按摩时的文件夹。

More in this category