Què és “desqueu” (i per què és important)

Skew es produeix quan un document és escanejat o fotografiat en un angle lleu (tipicament ±0-5°).El resultat: les línies de text no són horitzontals, els extrems verticals s’inclouen i la imatge té una subtila rotació. Deskev és el procés de Detectar l’angle d’esquena i girar la imatge enrere Així que les línies es tornen horitzontals / verticals.

Com l’esquema fa mal al seu pipeline

  • La precisió de l’OCR disminueix: les baselines inclinades obstaculitzen la segmentació, la descoberta de línies i la classificació de caràcters; petits angles poden reduir dràsticament la exactitud.
  • Els barcodes no poden decodificar: Moltes símboles lineals (per exemple, el Codi 128/39) són sensibles a la rotació; l’excés de esquivament redueix les lectures d’èxit.
  • Croping & layout detecció trencament: de l’extrem de la pàgina i la línia de taula de detectar sovint assumeix la geometria pròxim-ortogonal.

Com Aspose.Imaging corregeix l’escut - precisament

Aspose.Imaging exposa una desquena d’una trucada a les imatges de raster:

  • RasterImage.NormalizeAngle() - detecta automàticament l’angle d’esquena (utilitza internament GetSkewAnglei girar la imatge en el lloc.
  • Sobrecàrrega : NormalizeAngle(bool resizeProportionally, Color backgroundColor) — triar si expandir la canva per mantenir tot el contingut i quin color de fons** omple els racons creats per la rotació.

També hi ha col·lectius de Cloud & UI (REST i eina en línia) que exposen la mateixa operació si vostè està construint serveis o prototips.

Exemple complet (còpia de la pasta)

Aquest exemple mostra un preprocessament segur i un desgast robust amb Aspose.Imaging:

  • Carrega un escàndol (JPG / PNG / TIFF).
  • Opcionalment es converteix en grayscale i normalitza el contrast per a una millor detecció d’angle.
  • Calls NormalizeAngle(resizeProportionally: true, background: White).
  • Salva la imatge estretada.
  • Bonus: mostra com desplaçar cada pàgina en un TIFF de múltiples pàgines.
  • Requisits *
  • .NET 8 (o 6+)
  • El nou: 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 Funciona bé

  • Detecta** l’angle d’escull del text escanat típic (utilitzant les estadístiques de base/edge) i rotates en una sola trucada.
  • The resizeProportionally l’opció impedeix clipping corner, i el backgroundColor El paràmetre controla la ** color omplert** de les àrees recentment exposades.

Multi-page TIFF deskew (que veure)

  • Run NormalizeAngle * Per cada quadre * TiffFrame És una pàgina raster, així que la mateixa API s’aplica.
  • Conserva una vegada al final; considereu una compressió ** sense pèrdues** (per exemple, LZW/Deflate per RGB, CCITT Group 4 per bilevel).
  • Si vostè planeja OCR més endavant, mantenir les pàgines a 300 dpi (o més alt) per a preservar petits glyfs.

Els trencaclosques comuns - i com evitar-los

  • Crossegament després de la rotacióSi es gira sense ampliar els canvis, els racons es retallen. NormalizeAngle(true, Color.White) Per tant, es redueix de manera proporcional.

  • ** Els fons bruts truquen el detector d’angle**El soroll pesat o els gradients poden desencadenar l’estimació d’angle. fa normalització de la llum (twoak de contrast o grayscale) abans de despejar, però evita les fortes flors que eradicen els trencaclosques fina.

    • Extensió binària *Els límits durs poden crear basel·les fregades; primer es descansa, després es binariza per OCR si és necessari. (la guia de l’OCR enfatitza la correcció d’escull abans del pipeline.)
  • Scanar el barc en angles establesSi els codis de barres encara falten després de la descàrrega, comprovar que l’angle no estava saturat; les xerrades molt estúpides poden necessitar la rotació inicial/flip per metadades (EXIF) abans. NormalizeAngle.

FAQs

**Q: Canvia deskew la mida de la imatge?***A: * Si es pot passar resizeProportionally: true, les canvas creixen prou per mantenir tot el contingut -no creixent - omplint nous racons amb el color escollit.

**Q: Puc detectar els angles primer?**A: Deskew és normalment un tiro amb NormalizeAngle, però si necessiteu angles per a l’anàlisi, podeu mesurar utilitzant APIs relacionats (per exemple, els productes OCR exposen el càlcul d’angle).

**Q: Què passa amb el núvol / REST?**A: Aspose.Imaging Cloud exposa un deskew finalitzar si està construint un servei en lloc d’utilitzar la biblioteca .NET.

Takeaways

  • Skew fa mal a l’OCR, la lectura de codi de barres i l’anàlisi del layout.
  • Aspose.Imaging’s RasterImage.NormalizeAngle et dóna una correcció ràpida i fiable amb una sola trucada, a més d’opcions per protegir els límits del contingut.
  • Combina el preprocessament gentle (opcional) amb per-page deskew per a TIFFs de múltiples pàgines per maximitzar l’exactitud.

Amb aquestes pràctiques, les seves aplicacions .NET produiran escans més estrictes i més llegibles - i les teves etapes de l’OCR i el codi de barrer li agrairan.

More in this category