ما هو “Deskw” ( ولماذا يهم)

Skew يحدث عندما يتم فحص المستند أو التقاطه في زاوية خفيفة (عادة ±0–5°).النتيجة: خطوط النص ليست أفقية، يتم تثبيت الحواف الرأسي، والصورة لديها تدور صغير. الكشف عن زاوية الخرسانة وتدوير الصورة إلى الوراء ثم تصبح الخطوط أفقية / عمودية مرة أخرى.

كيف يؤذي البراغيث خط أنابيبك

  • ** انخفاض دقة OCR:** البازلين المطاطية تمنع الانقسام، والعثور على الخط، وتصنيف الشخصيات؛ زوايا صغيرة يمكن أن تقلل الدقة بشكل كبير.
  • لا يستطيع الباركود إزالة التخزين: العديد من الرموز الخطية (على سبيل المثال، رمز 128/39) حساسة للتحول؛ والخياطة المفرطة تقلل من القراءات الناجحة.
  • الانهيار والتخطيط اختلالات الكشف: كشف حافة الصفحة والكشف عن خط الطاولة غالبا ما يفترض الهندسة القريبة من الأرثوذكسية.

كيف Aspose.Imaging تصحيح الخرسانة – دقيقة

Aspose.Imaging يعرض صورة 1 مكالمة واحدة على صور الرسوم البيانية:

  • RasterImage.NormalizeAngle() - الكشف التلقائي عن زاوية الخرسانة (يستخدم داخليًا) GetSkewAngle) وتدور الصورة في مكانها.
  • المبالغ الزائدة : NormalizeAngle(bool resizeProportionally, Color backgroundColor) - اختيار ما إذا كنت ترغب في توسيع قوس قزح للحفاظ على كل المحتوى وما هو اللون الخلفي يملأ الزوايا التي تم إنشاؤها عن طريق الدوران.

هناك أيضًا أقسام Cloud & UI (REST والأدوات عبر الإنترنت) التي تظهر نفس العملية إذا كنت تقوم ببناء الخدمات أو النماذج الأولية.

نموذج كامل (Copy-Paste)

هذا المثال يظهر آمنة قبل المعالجة ومقاومة قوية مع Aspose.Imaging:

  • تحميل الفحص (JPG / PNG / TIFF)
  • تحويل اختياري إلى مقياس رمادي وتطبيع التباين للحصول على اكتشاف زاوية أفضل.
  • 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 يعمل بشكل جيد

  • يكتشف زاوية التمرير للنص الماسح النموذجي (باستخدام الإحصاءات الأساسية/السلسلة) و تدوير في مكالمة واحدة.
  • و هو resizeProportionally الخيار يمنع الشريط الزاوية، و backgroundColor يسيطر المعلم على اللون الممتلئ للمناطق التي تم التعرض لها حديثًا.

TIFF Deskew متعددة الصفحات (ماذا مشاهدة)

  • Run NormalizeAngle * لكل إطار * TiffFrame هو صفحة راستر ، لذلك ينطبق نفس API.
  • تخزين مرة واحدة في النهاية؛ فكر في ضغط بدون خسارة (على سبيل المثال، LZW/Deflate for RGB، CCITT Group 4 for bilevel).
  • إذا كنت تخطط لـ OCR في وقت لاحق ، فاحفظ الصفحات عند 300 dpi (أو أعلى) للحفاظ على غلافات صغيرة.

الحصى الشائعة - وكيفية تجنبها

  • الصراصير بعد الدورانإذا كنت تدور دون توسيع الأقواس ، يتم قطع الزوايا. NormalizeAngle(true, Color.White) * تراجع نسبياً *.

  • ** الخلفيات القذرة خدعة الكشف عن الزاوية**يمكن أن يضرب الضوضاء الشديدة أو الجرادينات تقدير الزاوية.فعل التطبيع الخفيف (مقاييس التباين أو الصخرة) قبل الانحناء، ولكن تجنب البراغيث القوية التي تزيل السكتة الدقيقة.

  • مقاصد التخفيضات الزائدةالحد الأقصى الصلب يمكن أن يخلق البازلين المطحونة؛ أولاً، ثم ثنائية لـ OCR إذا لزم الأمر. (تؤكد إرشادات OCR تصحيح التخفيف في وقت مبكر في خط أنابيب).

  • مشاهدة الباركود في زوايا متقلبةإذا كانت رموز الشريط لا تزال فاشلة بعد الانزلاق، والتحقق من أن الزاوية لم تكن مملوءة؛ قد تحتاج النقاط الضيقة للغاية إلى الدوران الأول/التدفق عن طريق البيانات الميتا (EXIF) قبل NormalizeAngle.

FAQs

  • س: هل يتغير حجم الصورة؟** A: * إذا كنت تفعل ذلك resizeProportionally: true، تنمو الأقواس بما فيه الكفاية للحفاظ على كل المحتوى - لا الحصاد - ملء الزوايا الجديدة مع لونك المختار.

  • س: هل يمكنني الكشف عن الزوايا أولاً؟*A: Deskew هو عادة واحد ضرب مع NormalizeAngleولكن إذا كنت بحاجة إلى زوايا لتحليل، يمكنك قياس باستخدام APIs ذات الصلة (على سبيل المثال، منتجات OCR يعرض حساب الزاوية).

** س: ماذا عن السحابة / REST؟**A: Aspose.Imaging Cloud يعرض deskew نقطة النهاية إذا كنت تبني خدمة بدلا من استخدام مكتبة .NET.

Takeaways

  • الخياطة تؤلم OCR، قراءة الباركود، وتحليل التصميم.
  • Aspose.Imaging’s RasterImage.NormalizeAngle يمنحك إصلاحًا أسرع وموثوق به مع مكالمة واحدة بالإضافة إلى خيارات لحماية حدود المحتوى.
  • مزيج المعالجة المسبقة (اختياري) مع للصفحة الواحدة لـ TIFFs متعددة الصفحات لتحقيق أقصى قدر من الدقة.

مع هذه الممارسات ، ستقوم تطبيقات .NET الخاصة بك بإنتاج فحوصات أكثر وضوحًا وأكثر قراءة - وسوف تشكرك خطوات OCR والرمز الشريط المنخفض.

More in this category