Що таке «дескеу» (і чому це важливо)
Skew відбувається, коли документ сканується або фотографується в легкому куті (типично ±0-5°).Результат: текстильні лінії не є горизонтальними, вертикальні країни застрягли, а зображення має тонку ротацію. Deskev - це процес Виявлення ґрунтового кута і повернення зображення назад Потім лінії знову стають горизонтальними/вертикальними.
Як скеу болить ваш трубопровід
- ОКР точність скорочується: запліднені базелі перешкоджають сегментації, пошуку ліній і класифікації персонажів; дрібні кути можуть драматично скоротити точність.
- Баркоди не декодуються: Багато лінійних симбологій (наприклад, код 128/39) є чутливими до ротації; надмірний сків зменшує успішні читання.
- Кропінг і розклад розпізнавання розрив: сторінка крайньої виявлення і табличної лінії виявляння часто приймає близько-ортогональну геометрію.
Як аспозувати.Імітація виправить скеу — точніше
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
Параметр контролює повнений колір нововикладених областей.
Multi-page TIFF deskew (що дивитися)
- Run
NormalizeAngle
• за рамками;TiffFrame
це растер-сторінка, так що така ж API застосовується. - Зберегти один раз в кінцевому підсумку; розглянути безпоручну компресію (наприклад, LZW/Deflate для RGB, CCITT Group 4 для bilevel).
- Якщо ви плануєте OCR пізніше, зберігайте сторінки на 300 dpi (або вище), щоб зберегти дрібні гліфи.
Захоплюючі випади – і як їх уникнути
«Повернення після ротації»Якщо ви обертаєте без розширення канави, куточки скорочуються.
NormalizeAngle(true, Color.White)
• «Пропорційно вимірювати».** Шкідливі фонові трики виявляють угальний детектор**Зробіть нормалізацію світла (контрастний потяг або грейскале) до розтягування, але уникайте сильних бляшок, які знищують тонкі інсульти.
- надбінаризаційний десктоп*Твердий прапор може створити запліднені базеліни; спочатку розкидайте, а потім бінарнізуйте для OCR, якщо це необхідно. (ОКР-довідка підкреслює ранню корекцію скеу в трубопроводі.)
- Сканування баркоду в стовпних куточках*Якщо баркоди все ще не встигають після розтягування, перевірте, що кут не насичений; дуже тонкі знімки можуть потребувати початкового ротації/фліпації за метаданими (EXIF) до
NormalizeAngle
.
- Сканування баркоду в стовпних куточках*Якщо баркоди все ще не встигають після розтягування, перевірте, що кут не насичений; дуже тонкі знімки можуть потребувати початкового ротації/фліпації за метаданими (EXIF) до
FAQ
** Q: Чи змінюється розмір зображення?*** А: * Якщо ви пройдете resizeProportionally: true
, ковбаси ростуть просто достатньо, щоб зберегти весь контент — не зрізати — заповнюючи нові кути з вашим вибраним кольором.
Q: Чи можу я в першу чергу розпізнати вугілля?**A: Дескев зазвичай одноразовий з NormalizeAngle
, але якщо вам потрібні кути для аналізу, ви можете вимірювати за допомогою пов’язаних АПІ (наприклад, продукти ОКР піддаються обчислюванню кута).
Q: Що таке облак / REST?A: Aspose.Imaging Cloud виявляє deskew
кінцевий пункт, якщо ви будуєте сервіс замість використання бібліотеки .NET.
Takeaways
- Skew болить OCR, читання баркодів і аналіз розташування.
- Aspose.Imaging’s RasterImage.NormalizeAngle дає вам швидке, надійне врегулювання за допомогою одного дзвінка, а також варіанти захисту меж контенту.
- Комбінуйте препроцесування джинсів (опціонально) з по-сторінковою платою для багатосторонніх TIFF, щоб максимізувати точність.
Завдяки цій практиці ваші програми .NET будуть виробляти більш чіткі, більш читаючі скани, а нижчі етапи OCR і баркоду будуть подякувати вам.