무엇이 ‘데스케우’ (그리고 왜 그것이 중요합니까)

Skew는 문서가 가벼운 각도에서 스캔되거나 촬영되면 발생합니다 (일반적으로 ±0 ~ 5°). 결과 : 텍스트 라인은 수평이 아니며, 수직 경계가 묶여 있으며, 이미지는 미묘한 회전을 가지고 있습니다. Deskev은 문자열의 프로세스입니다. 스케이 각도를 탐지하고 이미지를 뒤로 회전합니다. 그래서 라인은 다시 수평 / 수직이됩니다.

어떻게 스키가 당신의 파이프 라인을 다치게하는가

  • OCR 정확도 떨어집니다: 타이틀 바젤은 분열, 라인 찾기 및 캐릭터 분류를 방해합니다; 작은 각도는 정확도를 크게 줄일 수 있습니다.
  • 바코드가 삭제되지 않습니다: 많은 선형 상징 (예 : 코드 128/39)은 회전에 민감합니다; 과도한 스키는 성공적인 읽기를 줄입니다.
  • Cropping & layout detection break: 페이지 경계 및 테이블 라인 탐지 종종 가까운 정형 지질을 가져옵니다.

ASPOSE.Imaging은 스키를 정리하는 방법 - 정확하게

Aspose.Imaging은 래스터 이미지에 one-call deskew를 표시합니다.

  • RasterImage.NormalizeAngle() - 스케이 각도를 자동으로 탐지합니다 (내부 사용 GetSkewAngle) 그리고 장소에서 이미지를 회전합니다.
  • 과도한 부담 : 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 데스크 (보아야 할 것)

  • Run NormalizeAngle * 프레임에 따라 * TiffFrame 라스터 페이지가 있으므로 동일한 API가 적용됩니다.
  • 끝에 한 번 저장하십시오; ** 손실없는 압축** (예를 들어, LZW/Deflate for RGB, CCITT Group 4 for bilevel).
  • 나중에 OCR를 계획하는 경우 페이지를 300 dpi (또는 그 이상)로 유지하여 작은 글리프를 유지하십시오.

일반적인 낙타 붕괴 - 그리고 그들을 피하는 방법

    • 회전 후 십자가*캔버스를 확장하지 않고 회전하면 구석이 잘라집니다. NormalizeAngle(true, Color.White) * 비율적으로 삭감할 수 있습니다.
  • ** 더러운 배경은 각도 탐지기를 트릭합니다**강한 소음 또는 그라디언트는 각도 추정치를 균형 잡을 수 있습니다. 빛의 정상화 (대조 스위치 또는 녹색 스케일)를 제거하기 전에 수행하지만, 얇은 충격을 없애는 강력한 흐름을 피하십시오.

    • 과도한 바이너리화 스케치*단단한 경계선을 생성 할 수 있습니다; 먼저 분해, 필요한 경우 OCR에 이중화. (OCR 지침은 파이프 라인에서 일찍 스키 수정에 중점을 둡니다.)
  • **바르코드 스캔은 스테이프 각도에서*배코드가 여전히 실패한 경우, 구석이 만족되지 않았다는 것을 확인하십시오; 매우 단단한 샷은 초기 메타 데이터 (EXIF)로 회전/프립을 필요로 할 수 있습니다. NormalizeAngle.

FAQ

Q : Deskew는 이미지 크기를 변경합니까?* A : * 당신이 통과하는 경우 resizeProportionally: true, 캔버스는 당신이 선택한 색상으로 새로운 구석을 채우는 모든 콘텐츠를 유지하기에 충분히 성장합니다.

Q: 나는 먼저 구석을 발견 할 수 있습니까?**A: Deskew는 일반적으로 하나의 샷입니다. NormalizeAngle그러나 분석을위한 각도가 필요한 경우 관련 APIs를 사용하여 측정할 수 있습니다 (예 : OCR 제품은 각도 계산을 노출).

Q : 클라우드 / REST에 대해 어떻게 생각하십니까?A: Aspose.Imaging 클라우드는 A를 보여줍니다. deskew .NET 도서관을 사용하는 대신 서비스를 구축하는 경우 끝점.

Takeaways

  • Skew는 OCR, 바코드 읽기 및 레이아웃 분석에 상처를 입습니다.
  • Aspose.Imaging의 RasterImage.NormalizeAngle은 한 번의 전화를 통해 빠르고 신뢰할 수 있는 고정을 제공하며 콘텐츠 경계를 보호하는 옵션을 제공합니다.
  • gentle preprocessing (선택)와 per-page deskew를 여러 페이지 TIFF로 결합하여 정확성을 최대화합니다.

이러한 관행을 통해 .NET 애플리케이션은 더 튼튼하고 읽을 수 있는 스캔을 생성할 것이며, 아래의 OCR 및 바코드 단계는 감사할 것입니다.

More in this category