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 internamentGetSkewAngle
i 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 elbackgroundColor
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
- Optimitzar els gifs animats en .NET utilitzant Aspose.Imaging
- Optimitzar TIFFs multipages per a l'arxiu en .NET amb Aspose
- Animacions de dades en .NET amb Aspose.Imaging
- Comparació Lossy vs. Lossless Image Compression en .NET utilitzant Aspose.Imaging
- Compressió d'imatge sense pèrdues i de qualitat en .NET amb Aspose.Imaging