สิ่งที่ “deskew” (และทําไมมันสําคัญ)

Skew จะเกิดขึ้นเมื่อเอกสารถูกสแกนหรือถ่ายภาพในมุมเล็กน้อย (โดยปกติ ±0-5°) ผลลัพธ์: เส้นข้อความไม่แนวนอนขอบแนวตั้งจะถูกดัดและภาพมีหมุนซับซ้อน Deskiew เป็นกระบวนการของ การตรวจจับมุมสกรูและหมุนภาพกลับ ดังนั้นเส้นจะกลายเป็นแนวนอน/แนวตั้งอีกครั้ง

วิธีการบาดเจ็บท่อของคุณ

  • **ความแม่นยําของ OCR ลดลง: ** บาซลีนเคลือบป้องกันการแบ่งสายการค้นหาและการจัดอันดับตัวละครมุมขนาดเล็กสามารถลดความถูกต้องอย่างมาก
  • ** บาร์โค้ดไม่สามารถ decod:** สัญลักษณ์เชิงเส้นจํานวนมาก (เช่นรหัส 128/39) มีความไวต่อการหมุน การสแกนเกินไปช่วยลดการอ่านที่ประสบความสําเร็จ
  • **การตรวจจับข้อบกพร่องและการจัดระเบียบ: การตรวจพบหน้าและตารางเส้นมักจะนําไปใช้กับภูมิศาสตร์ที่ใกล้ชิด

วิธีการ Aspose.Imaging Fixes Skew—อย่างถูกต้อง

Aspose.Imaging แสดงตัวอักษรที่แสดงให้เห็นในภาพส่องสว่าง:

  • RasterImage.NormalizeAngle() — อัตโนมัติตรวจจับมุมสกรู (ใช้ภายใน GetSkewAngle) และหมุนภาพในสถานที่
  • อะไหล่: NormalizeAngle(bool resizeProportionally, Color backgroundColor) — เลือกว่าจะขยายช่องเพื่อเก็บเนื้อหาทั้งหมดและสีพื้นหลัง** จะเติมมุมที่สร้างขึ้นโดยการหมุน

นอกจากนี้ยังมีคู่ค้า Cloud & UI (REST และเครื่องมือออนไลน์) ที่แสดงให้เห็นถึงการทํางานเดียวกันถ้าคุณสร้างบริการหรือโปรโตคอล

ตัวอย่างเต็มรูปแบบ (copy-paste)

ตัวอย่างนี้แสดงให้เห็นว่าการประมวลผลก่อนที่ปลอดภัยและความแข็งแกร่งกับ Aspose.Imaging:

  • ดาวน์โหลดสแกน (JPG / PNG / TIFF)
  • ตัวเลือกแปลงเป็น grayscale & normalizes ความต้านทานสําหรับการตรวจจับมุมที่ดีขึ้น
  • Calls NormalizeAngle(resizeProportionally: true, background: White).
  • เก็บภาพที่รุนแรง
  • โบนัส: แสดงให้เห็นวิธีการลบแต่ละหน้าใน TIFF มัลติหน้า

*ข้อกําหนด *

  • .NET 8 (หรือ 6 +)
  • หมายเลข: Aspose.Imaging

using System;
using System.IO;
using Aspose.Imaging;
using Aspose.Imaging.FileFormats.Tiff;
using Aspose.Imaging.ImageOptions;

class Program
{
    static int Main(string[] args)
    {
        if (args.Length < 2)
        {
            Console.WriteLine("Usage: dotnet run -- <inputImageOrTiff> <outputImageOrTiff>");
            return 1;
        }

        string inputPath  = args[0];
        string outputPath = args[1];

        try
        {
            using (var image = Image.Load(inputPath))
            {
                // Multi-page TIFF? Deskew frame-by-frame.
                if (image is TiffImage tiff)
                {
                    foreach (var frame in tiff.Frames)
                    {
                        // --- Optional: lightweight preprocessing for better angle detection ---
                        // Convert to grayscale-like statistics to reduce chroma noise.
                        // Many real scans already are gray/bilevel; if not, Normalize() helps.
                        TryNormalizeForDeskew(frame);

                        // --- Deskew ---
                        // true  = expand canvas to avoid cropping
                        // White = fill color for the new corners created by rotation
                        frame.NormalizeAngle(true, Aspose.Imaging.Color.White);
                    }

                    tiff.Save(outputPath); // encoder inferred from extension
                }
                else
                {
                    // Single-page raster image
                    var raster = image as RasterImage 
                                 ?? throw new InvalidOperationException("Input is not a raster image.");

                    TryNormalizeForDeskew(raster);
                    raster.NormalizeAngle(true, Aspose.Imaging.Color.White);

                    // Choose encoder explicitly (e.g., PNG/JPEG/TIFF). Here we mirror input extension.
                    image.Save(outputPath);
                }
            }

            Console.WriteLine($"✅ Deskew complete: {Path.GetFullPath(outputPath)}");
            return 0;
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine("❌ " + ex.Message);
            return 2;
        }
    }

    /// <summary>
    /// Minimal, safe preprocessing to stabilize skew detection.
    /// Avoid heavy blurs that can smear thin text.
    /// </summary>
    private static void TryNormalizeForDeskew(RasterImage raster)
    {
        // Ensure pixels are accessible (performance hint for subsequent operations).
        raster.CacheData();

        // If the image has wildly varying brightness (camera shots), a light contrast
        // normalization can help align text lines for skew detection. The exact set
        // of helpers varies by version; keep it simple and non-destructive.
        //
        // Tip: If your version exposes BinarizeOtsu/AdaptiveBinarize, try them
        // *after* deskew for OCR workflows to preserve thin strokes.

        // Example: If available in your build, uncomment one of these:
        // raster.AdjustBrightnessContrast(brightness: 0, contrast: 10); // gentle contrast pop
        // raster.Grayscale(); // reduce chroma noise if present

        // Leave as-is if your scans are already clean (e.g., 300 dpi monochrome).
    }
}

Why NormalizeAngle ทํางานได้ดี

  • มัน ตรวจจับมุมสกรูสําหรับข้อความสแกนทั่วไป (ใช้สถิติพื้นฐาน / edge) และ หมุน ในโทรเดียว
  • อะไร resizeProportionally ตัวเลือกป้องกันไม่ให้ คอร์เนอร์ clipping และ backgroundColor พารามิเตอร์ควบคุม สีเต็ม ของพื้นที่ที่สัมผัสใหม่

Multi-page TIFF deskew (สิ่งที่ดู)

  • Run NormalizeAngle ต่อกรอบ TiffFrame เป็นหน้า raster ดังนั้น API ที่เดียวกันจะใช้
  • เก็บครั้งเดียวในตอนท้ายและพิจารณาการบีบอัด ไม่สูญเสีย (เช่น LZW/Deflate สําหรับ RGB, CCITT Group 4 สําหรับ bilevel)
  • หากคุณวางแผนที่จะ OCR จากนั้นให้หน้าใน 300 dpi (หรือสูงกว่า) เพื่อรักษา glyphs ขนาดเล็ก

เหล็กกล้าบัวทั่วไป - และวิธีการหลีกเลี่ยงพวกเขา

  • การขุดหลังการหมุนหากคุณหมุนโดยไม่ต้องขยายแถบมุมจะตัด ใช้ NormalizeAngle(true, Color.White) เพื่อ ลดลงอย่าง proportional

  • ** backgrounds สกปรก trick the angle detector**ความเสียงรบกวนที่รุนแรงหรือ gradients สามารถพิสูจน์คํานวณมุม ทํา การปรับตัวแสง (การเชื่อมต่อหรือขอบสีเทา) ก่อนหน้านี้ แต่หลีกเลี่ยงการสั่นสะเทือนที่แข็งแกร่งที่กําจัดอาการปวดบาง

  • ** ทั่วไบนารีสก์ท็อป**ความหนาแน่นที่หนักสามารถสร้างฐานลากระเหย; ล้างแรกแล้วไบนารีสําหรับ OCR ถ้าจําเป็น (คําแนะนําของ OCR มุ่งเน้นไปที่การแก้ไขการขุดล่วงหน้าในท่อ)

  • การสแกนรหัสบาร์โค้ดในมุมหนาหากบาร์โค้ดยังคงล้มเหลวหลังจากการเจาะ ตรวจสอบมุมไม่ได้ saturated; ไฟหนามากอาจต้องการการหมุนครั้งแรก / flip โดย metadata (EXIF) ก่อน NormalizeAngle.

FAQs

** Q: Deskew เปลี่ยนขนาดภาพหรือไม่****A:** ถ้าคุณผ่าน resizeProportionally: true, แถบจะเติบโตเพียงพอเพื่อให้เนื้อหาทั้งหมด - ไม่มีการกัดกร่อน - เต็มมุมใหม่ด้วยสีที่คุณเลือก

Q: ฉันสามารถสํารองการตรวจจับมุมแรกได้หรือไม่****A: Deskew เป็นมักเป็น One-shot กับ NormalizeAngleแต่ถ้าคุณต้องการมุมสําหรับการวิเคราะห์คุณสามารถวัดได้โดยใช้ APIs ที่เกี่ยวข้อง (เช่นผลิตภัณฑ์ OCR แสดงคํานวณมุม)

**Q: อย่างไรกับ Cloud / REST?**A: Aspose.Imaging Cloud แสดงให้เห็นว่า deskew endpoint ถ้าคุณกําลังสร้างบริการแทนที่จะใช้ห้องสมุด .NET

Takeaways

  • ** Skew ระยํา OCR, การอ่านรหัสบาร์และวิเคราะห์การตั้งค่า**
  • Aspose.Imaging’s RasterImage.NormalizeAngle ให้คุณการแก้ไขที่รวดเร็วและน่าเชื่อถือด้วยโทรเดียวรวมถึงตัวเลือกเพื่อปกป้องข้อ จํากัด ของเนื้อหา
  • ผสมการประมวลผลก่อนหน้านี้ gentle (ตัวเลือก) ด้วยการจัดเก็บข้อมูลต่อหน้า ** สําหรับ TIFFs จํานวนหน้าเพื่อเพิ่มความแม่นยําสูงสุด

ด้วยการปฏิบัติเหล่านี้แอป .NET ของคุณจะผลิตสแกนที่ชัดเจนและอ่านได้มากขึ้นและขั้นตอน OCR และรหัสบาร์ของคุณจะขอบคุณ

More in this category