การสแกนที่ไม่ดีภาพถ่ายโทรศัพท์แฟกซ์และภาพหน้าจอที่บีบอัดมักจะสูญเสีย OCR ข่าวดี: การประมวลผลก่อนเล็กน้อยเป็นทางยาว. คู่มือนี้จะให้คุณขั้นตอนที่ปฏิบัติและสามารถดําเนินการได้** (ตามลําดับที่สิ้นสุด) เพื่อทําความสะอาดภาพ ก่อน และเพื่อ ทูน มอเตอร์ OCR สําหรับผลลัพธ์ที่ดีขึ้นอย่างมาก

ตัวอย่างที่สมบูรณ

ข้อกําหนด

  • .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 - การประมวลผลก่อนภาพที่มีคุณภาพต่ํา

**วัตถุประสงค์: **ลดเสียงรบกวน normalize ความต้านทาน / ความสว่าง และ (ทางเลือก) upscale หรือเพาะปลูกก่อน 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
};

**เมื่อต้องเปลี่ยนแปลง: *

  • หากคุณยังคงเห็นกระจกเพิ่มขึ้น MedianFilterSize ไปยัง 5
  • หากตัวอักษรขนาดเล็กหายไปให้ลงกลับไปที่ 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
};

** กฎของ thumb:**

  • การสัมผัสเกินไป (ล้างออก): ลดความสว่าง (เช่น -10) และรักษาความต้านทานที่เหมาะสม
  • ภายใต้การสัมผัส (มืดเกินไป): เพิ่มความสว่าง (เช่น ** + 10**) และความต้านทาน (เป็น * + 20** )

1.4 การก่อสร้างท่อการประมวลผล & Preprocess

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 (ตัวเลือก) หมายเลขขนาดเล็ก

หากข้อความเป็น เล็กมาก (<10px ความสูง), upscale ก่อน 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 (ตัวเลือก) พืชภูมิภาคของความสนใจ (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 (ตัวเลือกถ้ามีในโครงสร้างของคุณ)

บาง 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 – Run OCR & Evaluate

นี่คือ การไหลที่แม่นยํา จากแกะสลัก: 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);
            }
        }
    }
}

**การส่งออกข้อความ:**เขียนลงในไฟล์สําหรับการตรวจสอบ:

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

อาการ → Fix (Cheat-Sheet ด้วยตัวเลือก API)

Symptomสิ่งที่จะลองวิธีการตั้งค่า (รหัส)
เสียงรบกวน / วัสดุ JPEGตัวกรองกลาง (3 → 5)new FilterOptions { MedianFilter = true, MedianFilterSize = 3 }
*สีดํา *เพิ่มความสว่าง (+5..+15) และความต้านทาน (+10.. +25)new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 }
*ล้างออก *ความสว่างลดลง (-5..-15), ความต้านทานที่ moderateBrightnessAdjustment = -10, ContrastAdjustment = 10..20
ข้อความขนาดเล็กมากสูงสุด × 1.25–× 1.75 จากนั้น OCRimage = Upscale(image, 1.5);
เสียงรบกวนพื้นหลัง / สีDIY คุบสังกะสีหรือ Crop ROIvar bin = ToBinary(image, 185); หรือ image = image.Clone(roi, ...)
**การสแกนที่ซับซ้อน *Deskew (ถ้ามีการสัมผัส) หรือ re-scan straighter(หากโครงสร้างของคุณแสดงให้เห็นถึงตัวเลือก Deskew ให้เปิดใช้งาน; อื่น ๆ crop & rescan)
*ภาษาผสม *การตั้งค่าภาษา OCR(s) อย่างชัดเจน(ถ้ามี) ocrEngine.Settings.Language = RecognitionLanguages.English;
เนื้อหาแท็บเล็ตพืชไปยังภูมิภาคตารางก่อน OCRimage.Clone(roi, image.PixelFormat)

ไม่ทั้งหมดของโครงสร้างแสดงให้เห็นถึงการตั้งค่าของเครื่องเดียวกัน** หากคุณไม่สามารถใช้ในแพคเกจของคุณขึ้นอยู่กับเทคนิคการประมวลผลก่อนหน้าของภาพด้านบน – พวกเขาเป็น API ที่มั่นคงและมีประสิทธิภาพ

แนวทางที่ดีที่สุด

  • การสั่นสะเทือนในขั้นตอนขนาดเล็ก เปลี่ยนพารามิเตอร์หนึ่งครั้ง (เช่น MedianFilterSize 3 → 5) และเปรียบเทียบผลไม้
  • โปรด ROI. การเชื่อมโยงไปยังพื้นที่ที่เกี่ยวข้องเท่านั้นมักจะขัดกรองใด ๆ
  • หลีกเลี่ยงการประมวลผลมากเกินไป บลู / อัปสแคลนจํานวนมากสามารถทําลายรูปร่างของ glyph
  • ** Baselins อัตโนมัติ.** เก็บชุดขนาดเล็กของภาพทองและเรียกใช้พวกเขาใน CI เพื่อตรวจจับการย้อนกลับ
  • บันทึกตัวกลาง. บันทึกภาพที่ได้รับการประมวลผลแล้วไปยัง A ./debug/ โฟลเดอร์ในระหว่างการดูด

More in this category