Що таке «дескеу» (і чому це важливо)

Skew відбувається, коли документ сканується або фотографується в легкому куті (типично ±0-5°).Результат: текстильні лінії не є горизонтальними, вертикальні країни застрягли, а зображення має тонку ротацію. Deskev - це процес Виявлення ґрунтового кута і повернення зображення назад Потім лінії знову стають горизонтальними/вертикальними.

Як скеу болить ваш трубопровід

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

Як аспозувати.Імітація виправить скеу — точніше

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 Параметр контролює повнений колір нововикладених областей.

Multi-page TIFF deskew (що дивитися)

  • Run NormalizeAngle • за рамками; TiffFrame це растер-сторінка, так що така ж API застосовується.
  • Зберегти один раз в кінцевому підсумку; розглянути безпоручну компресію (наприклад, LZW/Deflate для RGB, CCITT Group 4 для bilevel).
  • Якщо ви плануєте OCR пізніше, зберігайте сторінки на 300 dpi (або вище), щоб зберегти дрібні гліфи.

Захоплюючі випади – і як їх уникнути

  • «Повернення після ротації»Якщо ви обертаєте без розширення канави, куточки скорочуються. NormalizeAngle(true, Color.White) • «Пропорційно вимірювати».

  • ** Шкідливі фонові трики виявляють угальний детектор**Зробіть нормалізацію світла (контрастний потяг або грейскале) до розтягування, але уникайте сильних бляшок, які знищують тонкі інсульти.

    • надбінаризаційний десктоп*Твердий прапор може створити запліднені базеліни; спочатку розкидайте, а потім бінарнізуйте для OCR, якщо це необхідно. (ОКР-довідка підкреслює ранню корекцію скеу в трубопроводі.)
    • Сканування баркоду в стовпних куточках*Якщо баркоди все ще не встигають після розтягування, перевірте, що кут не насичений; дуже тонкі знімки можуть потребувати початкового ротації/фліпації за метаданими (EXIF) до NormalizeAngle.

FAQ

** Q: Чи змінюється розмір зображення?*** А: * Якщо ви пройдете resizeProportionally: true, ковбаси ростуть просто достатньо, щоб зберегти весь контент — не зрізати — заповнюючи нові кути з вашим вибраним кольором.

Q: Чи можу я в першу чергу розпізнати вугілля?**A: Дескев зазвичай одноразовий з NormalizeAngle, але якщо вам потрібні кути для аналізу, ви можете вимірювати за допомогою пов’язаних АПІ (наприклад, продукти ОКР піддаються обчислюванню кута).

Q: Що таке облак / REST?A: Aspose.Imaging Cloud виявляє deskew кінцевий пункт, якщо ви будуєте сервіс замість використання бібліотеки .NET.

Takeaways

  • Skew болить OCR, читання баркодів і аналіз розташування.
  • Aspose.Imaging’s RasterImage.NormalizeAngle дає вам швидке, надійне врегулювання за допомогою одного дзвінка, а також варіанти захисту меж контенту.
  • Комбінуйте препроцесування джинсів (опціонально) з по-сторінковою платою для багатосторонніх TIFF, щоб максимізувати точність.

Завдяки цій практиці ваші програми .NET будуть виробляти більш чіткі, більш читаючі скани, а нижчі етапи OCR і баркоду будуть подякувати вам.

More in this category