Какво е „дескев“ (и защо е важно)

Skew се случва, когато документът е скениран или фотографиран в лесен ъгъл (обикновено ±0–5°). Резултатът: текстовите линии не са хоризонтални, вертикалните ръбове са фиксирани и изображението има фина ротация. Deskev е процесът на Откриване на ъгъла и въртене на изображението назад Така линията отново става хоризонтална / вертикална.

Как шейкът боли тръбата ви

  • ОКР прецизност пада: наклонени базели препятстват сегментацията, намирането на линии и класификацията на характера; малки ъгли могат да намалят точността драматично.
  • Баркодите не могат да декодират: Много линейни символи (напр. Код 128/39) са чувствителни към ротацията; прекомерното скеиране намалява успешните чети.
  • Кропиране и разположение откриване прекъсване: страница край откриването и таблична линия открива често приема близо-ортогонална геометрия.

Как Aspose.Imaging фиксира скеу — точно

Aspose.Imaging разкрива единно обаждане десктоп на растерни изображения:

  • RasterImage.NormalizeAngle() - Авто-открива ъгъла на скеума (вътрешно се използва GetSkewAngleи върти изображението на мястото.
  • Претоварване на: NormalizeAngle(bool resizeProportionally, Color backgroundColor) — да изберете дали да разширите контейнера, за да запазите цялото съдържание и кой ** цвет на фона** запълва ъглите, създадени от ротацията.

Има и Cloud & UI колеги (REST и онлайн инструмент), които излагат една и съща работа, ако изграждате услуги или прототипи.

Допълнителен пример (копиране на паста)

Този пример показва безопасното предварително обработване и устойчиво разклонение с 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 десктоп (което да гледате)

  • Run NormalizeAngle * за всяка рамка *; TiffFrame е растер страница, така че същата API се прилага.
  • Спестете веднъж в края; помислете за без загуба компресия (например LZW/Deflate за RGB, CCITT Group 4 за bilevel).
  • Ако планирате да отидете в OCR по-късно, запазете страници на 300 dpi (или повече), за да запазите малки глифи.

Често срещани пъпки - и как да ги избегнете

  • Пътешествие след ротацияАко се въртите без да разширявате канавите, ъглите се нарязват. NormalizeAngle(true, Color.White) Да се отървем пропорционално.

  • Грязните фонове тревожат ъгловия детекторТежък шум или градиенти могат да нарушат изчислението на ъгъла. ** светлина нормализиране** (контраст твойк или грейскал) преди отваряне, но избягвайте силни бръчки, които елиминират тънки инсулт.

    • Превишаване на бинарната десктоп*Твърдият праг може да създаде джогирани базели; първо десква, а след това бинарни за OCR, ако е необходимо. (ОКР ръководство подчертава корекцията на скеу рано в тръбопровода.)
    • Скениране на баркода в степи ъгли*Ако баркодите все още се провалят след отваряне, проверете, че ъгълът не е наситен; много стъклени снимки може да се нуждаят от първоначално въртене / флип по метаданни (EXIF) преди NormalizeAngle.

ФАК

Q: Променя ли десктоп размера на изображението?* А: * Ако преминавате resizeProportionally: true, канавите растат достатъчно, за да запазят цялото съдържание – без да се натрупват – като попълват нови ъгли с избрания от вас цвят.

Q: Мога ли да открия пръв ъгъл?**A: Deskew обикновено е еднократна с NormalizeAngle, но ако имате нужда от ъгли за анализ, можете да измервате с помощта на свързани АПИ (например, продуктите на OCR излагат изчисление на Ъгъла).

Q: Какво става с Cloud / REST?**A: Aspose.Imaging Cloud разкрива deskew В края на краищата, ако изграждате услуга вместо да използвате .NET библиотеката.

Takeaways

  • Skew боли OCR, четене на баркодове и анализ на оформлението.
  • Aspose.Imaging RasterImage.NormalizeAngle ви дава бърза, надеждна корекция с един повик, плюс опции за защита на границите на съдържанието.
  • Комбинирайте Gentle Preprocessing (опционално) с per-page deskew за многострани TIFFs, за да увеличите точността.

С тези практики, вашите .NET приложения ще произвеждат по-тънки, повече четими скани - и вашите ниски OCR и стъпки на баркода ще ви благодарят.

More in this category