Какво е „дескев“ (и защо е важно)
Skew се случва, когато документът е скениран или фотографиран в лесен ъгъл (обикновено ±0–5°). Резултатът: текстовите линии не са хоризонтални, вертикалните ръбове са фиксирани и изображението има фина ротация. Deskev е процесът на Откриване на ъгъла и въртене на изображението назад Така линията отново става хоризонтална / вертикална.
Как шейкът боли тръбата ви
- ОКР прецизност пада: наклонени базели препятстват сегментацията, намирането на линии и класификацията на характера; малки ъгли могат да намалят точността драматично.
- Баркодите не могат да декодират: Много линейни символи (напр. Код 128/39) са чувствителни към ротацията; прекомерното скеиране намалява успешните чети.
- Кропиране и разположение откриване прекъсване: страница край откриването и таблична линия открива често приема близо-ортогонална геометрия.
Как Aspose.Imaging фиксира скеу — точно
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
параметърът контролира пълния цвят на новоизложените зони.
Мулти-страница TIFF десктоп (което да гледате)
- Run
NormalizeAngle
* за всяка рамка *;TiffFrame
е растер страница, така че същата API се прилага. - Спестете веднъж в края; помислете за без загуба компресия (например LZW/Deflate за RGB, CCITT Group 4 за bilevel).
- Ако планирате да отидете в OCR по-късно, запазете страници на 300 dpi (или повече), за да запазите малки глифи.
Често срещани пъпки - и как да ги избегнете
Пътешествие след ротацияАко се въртите без да разширявате канавите, ъглите се нарязват.
NormalizeAngle(true, Color.White)
Да се отървем пропорционално.Грязните фонове тревожат ъгловия детекторТежък шум или градиенти могат да нарушат изчислението на ъгъла. ** светлина нормализиране** (контраст твойк или грейскал) преди отваряне, но избягвайте силни бръчки, които елиминират тънки инсулт.
- Превишаване на бинарната десктоп*Твърдият праг може да създаде джогирани базели; първо десква, а след това бинарни за OCR, ако е необходимо. (ОКР ръководство подчертава корекцията на скеу рано в тръбопровода.)
- Скениране на баркода в степи ъгли*Ако баркодите все още се провалят след отваряне, проверете, че ъгълът не е наситен; много стъклени снимки може да се нуждаят от първоначално въртене / флип по метаданни (EXIF) преди
NormalizeAngle
.
- Скениране на баркода в степи ъгли*Ако баркодите все още се провалят след отваряне, проверете, че ъгълът не е наситен; много стъклени снимки може да се нуждаят от първоначално въртене / флип по метаданни (EXIF) преди
ФАК
Q: Променя ли десктоп размера на изображението?* А: * Ако преминавате resizeProportionally: true
, канавите растат достатъчно, за да запазят цялото съдържание – без да се натрупват – като попълват нови ъгли с избрания от вас цвят.
Q: Мога ли да открия пръв ъгъл?**A: Deskew обикновено е еднократна с NormalizeAngle
, но ако имате нужда от ъгли за анализ, можете да измервате с помощта на свързани АПИ (например, продуктите на OCR излагат изчисление на Ъгъла).
Q: Какво става с Cloud / REST?**A: Aspose.Imaging Cloud разкрива deskew
В края на краищата, ако изграждате услуга вместо да използвате .NET библиотеката.
Takeaways
- Skew боли OCR, четене на баркодове и анализ на оформлението.
- Aspose.Imaging RasterImage.NormalizeAngle ви дава бърза, надеждна корекция с един повик, плюс опции за защита на границите на съдържанието.
- Комбинирайте Gentle Preprocessing (опционално) с per-page deskew за многострани TIFFs, за да увеличите точността.
С тези практики, вашите .NET приложения ще произвеждат по-тънки, повече четими скани - и вашите ниски OCR и стъпки на баркода ще ви благодарят.
More in this category
- Оптимизиране на анимирани GIFs в .NET с помощта на Aspose.Imaging
- Оптимизиране на Multi-Page TIFFs за архивиране в .NET с Aspose
- HEIC към JPEG/PNG Конверсия с Aspose.Imaging за .NET
- Анимации, насочени към данни в .NET с Aspose.Imaging
- Без загуба и качествено дефинирана компресия на изображението в .NET с Aspose.Imaging