چه چیزی “deskew” است (و چرا مهم است)

Skew زمانی اتفاق می افتد که یک سند در زاویه ی خفیف (به طور معمول ±0 تا 5 درجه) اسکن یا عکس گرفته می شود.نتایج: خطوط متن افقی نیستند، لبه های عمودی پوشیده می شوند و تصویر دارای چرخش ظریف است. Deskiew فرآیند کشف زاویه اسکی و چرخش تصویر به عقب به این ترتیب خطوط به صورت افقی / عمودی باز می گردند.

چگونگی آسیب رساندن به خط لوله

  • ** دقت OCR کاهش می یابد: ** پایه های چسبیده مانع از تقسیم بندی، یافتن خط و طبقه بندی شخصیت می شوند؛ زاویه های کوچک می توانند دقت را به طور چشمگیری کاهش دهند.
  • بارکودها نمی توانند رمزگذاری شوند: بسیاری از نمادهای خطی (به عنوان مثال، کد 128/39) حساس به چرخش هستند؛ اسکی بیش از حد خواندن موفقیت را کاهش می دهد.
  • کروپینگ & طرح تشخیص شکاف: تشخیص لبه صفحه و تشخیص خط میز اغلب جغرافیای نزدیک به ارتوگون را در نظر می گیرد.

چگونه Aspose.Imaging تثبیت اسکای – دقیق

Aspose.Imaging یک تصویر تک تماس را در تصاویر راستر نشان می دهد:

  • RasterImage.NormalizeAngle() – اتوماتیک تشخیص زاویه اسکی (در داخل استفاده می شود) GetSkewAngle) و تصویر را در جای خود چرخانید.
  • بیش از حد : NormalizeAngle(bool resizeProportionally, Color backgroundColor) — انتخاب کنید که آیا برای گسترش قفسه به نگه داشتن تمام محتوا و که ** رنگ پس زمینه** پر کردن گوشه های ایجاد شده توسط چرخش.

همچنین همتایان ابر و رابط کاربری (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 برای RGB، CCITT Group 4 برای bilevel).
  • اگر قصد دارید بعداً به OCR بروید، صفحات را در 300 dpi (یا بالاتر) نگه دارید تا گلیف های کوچک را حفظ کنید.

آسیب های ناشی از تشنج - و چگونه از آنها اجتناب کنیم

  • تولید پس از چرخشاگر بدون گسترش قفسه ها چرخید، گوشه ها قطع می شوند. NormalizeAngle(true, Color.White) تغییرمسیر به صورت نسبی

  • ** پس زمینه های کثیف نشان دهنده زاویه را هدایت می کنند**صدای سنگین یا گرادین ها می توانند تخمین زاویه را از بین ببرند. تعادل نور (نمایش کنتراست یا مقیاس خاکستری) را قبل از انقباض انجام دهید، اما از خروپف های قوی که سکته های نازک را حذف می کنند، اجتناب کنید.

  • **تغییرمسیر بیش از دوگانه*محدودیت سخت می تواند پایه های چوبی را ایجاد کند؛ ابتدا دکمه کنید، سپس در صورت لزوم برای OCR دوگانه کنید. (توصیه OCR تاکید بر اصلاح زود در خط لوله.)

  • ** اسکن بارکد در زاویه های پایدار*اگر بارکدها هنوز پس از انقباض شکست می خورند، بررسی زاویه اشباع نشده است؛ تیراندازی های بسیار نازک ممکن است نیاز به چرخش اولیه/فلیپ با متا داده ها (EXIF) داشته باشند. NormalizeAngle.

FAQ ها

** Q: آیا Deskew اندازه تصویر را تغییر می دهد؟**A: اگر شما عبور می کنید resizeProportionally: true, قفسه ها به اندازه کافی رشد می کنند تا تمام محتوا را نگه دارند – بدون خرد کردن – پر کردن گوشه های جدید با رنگ انتخاب شده شما.

Q: آیا می توانم زاویه ها را اول تشخیص دهم؟A: Deskew به طور معمول یک ضربه با NormalizeAngleاما اگر شما نیاز به زاویه برای تجزیه و تحلیل، شما می توانید با استفاده از APIs مرتبط اندازه گیری (به عنوان مثال، محصولات OCR در معرض محاسبه زاوی).

** Q: در مورد ابر / REST چیست؟**A: Aspose.Imaging Cloud نشان می دهد که deskew نقطه پایان اگر شما در حال ساخت یک سرویس به جای استفاده از کتابخانه .NET.

Takeaways

  • Skew آسیب OCR، خواندن کد نوار، و تجزیه و تحلیل طرح.
  • Aspose.Imaging RasterImage.NormalizeAngle به شما یک اصلاح سریع و قابل اعتماد با یک تماس، به علاوه گزینه هایی برای محافظت از مرزهای محتوا می دهد.
  • ترکیب Gentle Preprocessing (اختیاری) با per-page deskew برای TIFF های چند صفحه ای برای حداکثر دقت.

با استفاده از این شیوه ها، اپلیکیشن های .NET شما اسکن های دقیق تر و قابل خواندن بیشتری را تولید خواهند کرد و مراحل OCR و بارکد شما از شما تشکر خواهد کرد.

More in this category