Что такое «дескев» (и почему это важно)
Skew происходит, когда документ сканируется или фотографируется в легком угле (обычно ±0–5°).Результат: текстовые линии не горизонтальны, вертикальные краины фиксируются, а изображение имеет тонкую ротацию. Deskev является процессом обнаружение угла сква и вращение изображения назад Таким образом, линии снова становятся горизонтальными/вертикальными.
Как шерсть вредит вашему трубопроводу
- ОКР точность падает: наклоненные базели препятствуют сегментации, распознаванию линии и классификации персонажа; небольшие углы могут резко сократить точность.
- Баркоды не способны декодировать: Многие линейные симбологии (например, код 128/39) чувствительны к вращению; чрезмерное скеирование снижает успехи в чтении.
- Кропинг и распределение разрыв обнаружения: выделение краю страницы и табличной линии часто предполагает ближе-ортогональную геометрию.
Как Aspose.Imaging фиксирует скеу — точно
Aspose.Imaging раскрывает на растерных изображениях один звонок-дескев:
RasterImage.NormalizeAngle()
— автоматически выявляет угол скважины (внутри используетсяGetSkewAngle
3) и поворачивает изображение на месте.- Перегрузка :
NormalizeAngle(bool resizeProportionally, Color backgroundColor)
— выберите, расширять ли канаву, чтобы сохранять все содержимое и какая ** цвет фонов** заполняет углы, созданные ротацией.
Существуют также Cloud & UI (REST и онлайн-инструменты), которые демонстрируют ту же операцию, если вы строите услуги или прототипы.
Дополнительный пример (copy-paste)
Этот пример показывает безопасную предварительную обработку и прочную десквировку с 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 deskew (что посмотреть)
- Run
NormalizeAngle
• по рамке;TiffFrame
Это растер-страница, поэтому применяется тот же API. - Сберегайте один раз в конце; рассмотрите безопасную компрессию (например, LZW/Deflate для RGB, CCITT Group 4 для bilevel).
- Если вы планируете OCR позже, сохраните страницы на 300 dpi (или выше), чтобы сохранить небольшие глифы.
Частые выпады грызунов — и как их избежать
Кроппинг после ротацииЕсли вы поворачиваете, не расширяя канавы, углы вырезаются.
NormalizeAngle(true, Color.White)
«Пропорционально отстаивать».Грязные фоновые трюки на уголный детекторСильный шум или градиенты могут нарушать уголную оценку.Дайте светловую нормализацию (контрастная стека или грейскале) перед отверстием, но избегайте сильных пузырьков, которые устраняют тонкие инсульты.
**Овер-бинаризационный десктоп*Твердые лимиты могут создавать ягированные базелины; сперва рассеивайте, а затем, если это необходимо, бинарнизируйте для OCR. (ОКР-управление акцентирует внимание на коррекции скея рано в трубопроводе.)
- Сканирование баркода в степных углах*Если баркоды по-прежнему проваливаются после отверстия, проверьте, что угол не насыщен; очень тонкие выстрелы могут потребовать первоначального ротации/флипа по метаданным (EXIF) до
NormalizeAngle
.
- Сканирование баркода в степных углах*Если баркоды по-прежнему проваливаются после отверстия, проверьте, что угол не насыщен; очень тонкие выстрелы могут потребовать первоначального ротации/флипа по метаданным (EXIF) до
FAQs
** Q: Изменяет ли Deskew размер изображения?*** A: * Если вы пройдете resizeProportionally: true
, ковры растут достаточно, чтобы сохранять весь контент — не набирая — заполняя новые углы вашим выбранным цветом.
Q: Можно ли я впервые обнаружить углы?**A: Deskew обычно одноразовый с NormalizeAngle
, но если вам нужны углы для анализа, вы можете измерить с помощью связанных АПИ (например, продукты ОКР выделяют вычисление угла).
Q: Что такое Cloud/REST?A: Aspose.Imaging Cloud раскрывает deskew
конечная точка, если вы строите сервис вместо использования библиотеки .NET.
Takeaways
- Skew болит OCR, чтение баркода и анализ расположения.
- Aspose.Imaging RasterImage.NormalizeAngle дает вам быстрое и надежное исправление с одним звонком, а также варианты защиты границ контента.
- Комбинируйте препроцессирование шланга (опционально) с пер-страничный отверстий для множества страниц TIFF для максимальной точности.
С помощью этих практик ваши приложения .NET будут производить более яркие, более читаемые сканирования, а ваши низкие стадии OCR и баркода будут вам благодарны.