Что такое «дескев» (и почему это важно)

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

Как шерсть вредит вашему трубопроводу

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

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

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

  • RasterImage.NormalizeAngle() — автоматически выявляет угол скважины (внутри используется GetSkewAngle3) и поворачивает изображение на месте.
  • Перегрузка : 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 для RGB, CCITT Group 4 для bilevel).
  • Если вы планируете OCR позже, сохраните страницы на 300 dpi (или выше), чтобы сохранить небольшие глифы.

Частые выпады грызунов — и как их избежать

  • Кроппинг после ротацииЕсли вы поворачиваете, не расширяя канавы, углы вырезаются. NormalizeAngle(true, Color.White) «Пропорционально отстаивать».

  • Грязные фоновые трюки на уголный детекторСильный шум или градиенты могут нарушать уголную оценку.Дайте светловую нормализацию (контрастная стека или грейскале) перед отверстием, но избегайте сильных пузырьков, которые устраняют тонкие инсульты.

  • **Овер-бинаризационный десктоп*Твердые лимиты могут создавать ягированные базелины; сперва рассеивайте, а затем, если это необходимо, бинарнизируйте для OCR. (ОКР-управление акцентирует внимание на коррекции скея рано в трубопроводе.)

    • Сканирование баркода в степных углах*Если баркоды по-прежнему проваливаются после отверстия, проверьте, что угол не насыщен; очень тонкие выстрелы могут потребовать первоначального ротации/флипа по метаданным (EXIF) до NormalizeAngle.

FAQs

** Q: Изменяет ли Deskew размер изображения?*** A: * Если вы пройдете resizeProportionally: true, ковры растут достаточно, чтобы сохранять весь контент — не набирая — заполняя новые углы вашим выбранным цветом.

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

Q: Что такое Cloud/REST?A: Aspose.Imaging Cloud раскрывает deskew конечная точка, если вы строите сервис вместо использования библиотеки .NET.

Takeaways

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

С помощью этих практик ваши приложения .NET будут производить более яркие, более читаемые сканирования, а ваши низкие стадии OCR и баркода будут вам благодарны.

More in this category