Qu’est-ce que le “deskew” (et pourquoi il est important)
Skew se produit lorsque un document est scanné ou photographié à un angle léger (typiquement ±0-5°).Le résultat: les lignes de texte ne sont pas horizontales, les bords verticaux sont tapés et l’image a une rotation subtile. Deskev est le processus de Détecter l’angle de la façade et tourner l’image en arrière Les lignes deviennent horizontales et verticales.
Comment l’aiguille endommage votre pipeline
- L’exactitude de l’OCR diminue: Les baselines tapées empêchent la segmentation, la découverte de lignes et la classification des caractères; les petits angles peuvent réduire dramatiquement la précision.
- Les barcodes échouent à décoder: De nombreuses symbologies linéaires (par exemple, le code 128/39) sont sensibles à la rotation; l’excès d’échappement réduit les lectures réussies.
- ** Cropping & layout detection break:** la détection de bord de page et de ligne de table détecte souvent la géométrie proche de l’orthogone.
Comment Aspose.Imaging réparer le sceau — précisément
Aspose.Imaging expose un un-call desquew sur les images de raster:
RasterImage.NormalizeAngle()
- détecte automatiquement l’angle de la plaque (utilisé à l’intérieur)GetSkewAngle
et tourne l’image en place.- surcharge :
NormalizeAngle(bool resizeProportionally, Color backgroundColor)
— choisissez si l’extension de la canve pour conserver tous les contenus et quelle ** couleur d’arrière-plan** remplit les coins créés par la rotation.
Il y a aussi des contreparties Cloud & UI (REST et outil en ligne) qui exposent la même opération si vous construisez des services ou des prototypes.
Exemple complet (copy-paste)
Cet exemple montre une pré-procession sûre et une déchirure robuste avec Aspose.Imaging:
- Il est chargé d’un scan (JPG / PNG / TIFF).
- Optionnellement, il convertit en grayscale et normalisera le contraste pour une meilleure détection d’angle.
- Calls
NormalizeAngle(resizeProportionally: true, background: White)
. - Sauve l’image éclairée.
- Bonus: montre comment désactiver chaque page dans un TIFF multi-page.
- Les exigences *
- .NET 8 (ou 6+)
- Nouveau :
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
fonctionne bien
- Il ** détecte** l’angle d’écran pour le texte scané typique (en utilisant les statistiques de base/edge) et rotates dans un seul appel.
- Le
resizeProportionally
l’option empêche ** clipping corner**, et lebackgroundColor
Le paramètre contrôle la ** couleur remplie** des zones nouvellement exposées.
Multi-page TIFF deskew (qui regarder)
- Run
NormalizeAngle
* pour le cadre *TiffFrame
C’est une page raster, donc la même API s’applique. - Économisez une fois à la fin; considérez une compression sans perte** (par exemple, LZW/Deflate pour RGB, CCITT Group 4 pour bilevel).
- Si vous prévoyez OCR plus tard, gardez les pages à 300 dpi (ou plus) pour préserver de petits glyphes.
Combien de déchets d’ail - et comment les éviter
- Crépuscule après la rotation*Si vous tournez sans élargir les canvas, les cornes sont coupées.
NormalizeAngle(true, Color.White)
Il faut que l’on soit « proportionnel ».
- Crépuscule après la rotation*Si vous tournez sans élargir les canvas, les cornes sont coupées.
Dirty backgrounds trique le détecteur d’angleLes bruits lourds ou les gradients peuvent échapper à l’estimation d’angle. Faites normalisation de la lumière (tweak de contraste ou grayscale) avant la déchirure, mais évitez les blures fortes qui élimine les crises minces.
- L’excellence de la bénédiction*Le seuil dur peut créer des bas-liens déchirés; déchaînez d’abord, puis binarisez pour OCR si nécessaire. (le guide de l’OCR souligne la correction de la faille tôt dans le pipeline.)
Barcode scan à angles stablesSi les codes barres échouent encore après la déchirure, vérifiez que l’angle n’a pas été saturé; les coups très étroits peuvent nécessiter la rotation initiale/flip par métadonnées (EXIF) avant
NormalizeAngle
.
FAQs
Q: Est-ce que deskew change la taille de l’image ?* A : * Si vous passez resizeProportionally: true
, les canvas se développent suffisamment pour garder tout le contenu – pas de crépuscule – remplissant de nouveaux coins avec votre couleur choisie.
Q : Puis-je détecter les angles d’abord ?**A: Deskew est généralement un coup de feu avec NormalizeAngle
Mais si vous avez besoin d’angles pour l’analyse, vous pouvez mesurer en utilisant des APIs connexes (par exemple, les produits OCR exposent le calcul de angle).
Q : Qu’en est-il du Cloud/REST ?A: Aspose.Imaging Cloud expose une deskew
endpoint si vous construisez un service au lieu d’utiliser la bibliothèque .NET.
Takeaways
- Skew souffre de l’OCR, de la lecture de code bar et d’analyse de layout.
- Aspose.Imaging’s RasterImage.NormalizeAngle vous donne une correction rapide et fiable avec une seule appel, plus des options pour protéger les limites du contenu.
- Combine le pré-processage gentle (optionnel) avec le répertoire par page pour les TIFF multi-page afin de maximiser l’exactitude.
Grâce à ces pratiques, vos applications .NET produiront des scans plus rigoureux et plus lisibles – et vos étapes de l’OCR et de la barre de code vous remercieront.
More in this category
- Optimiser les GIF animés dans .NET en utilisant Aspose.Imaging
- Optimiser les TIFF multi-page pour l'archivage dans .NET avec Aspose
- Animations à base de données dans .NET avec Aspose.Imaging
- Comparer Lossy vs. Lossless Image Compression dans .NET en utilisant Aspose.Imaging
- Compression d'image sans perte et déterminée de qualité dans .NET avec Aspose.Imaging