「デスケウ」とは何ですか(そしてなぜ重要なのか)

Skewは、文書が軽い角度(通常は±0~5°)でスキャンまたは撮影される場合に発生します。結果:テキストラインは水平ではない、垂直の端が曲がり、画像は微妙な回転があります。 スキーの角度を検出し、画像を回転させる 線は再び水平/垂直になります。

パイプラインをどのように傷つけるか

  • OCRの正確性が下がります: タイトルベーゼルは、分割、ライン検索、およびキャラクターの分類を妨げます; 小さな角度は精度を劇的に減らすことができます。
  • **バーコードは解読できない:**多くの線形シンボロジー(たとえば、Code 128/39)は回転に敏感であり、過剰なスキーは成功した読み込みを減らす。
  • Cropping & layout detection break: ページの端の検出とテーブルライン検査は、しばしぶりに正方形の地理学を採用します。

ASPOSE.Imaging fixes skw — 正確に

Aspose.Imaging は、ラスター画像に one-call deskew を表示します。

  • RasterImage.NormalizeAngle() スキーの角度を自動的に検出する(内部使用) GetSkewAngleイメージをその場所に回転させます。
  • 過剰負荷: NormalizeAngle(bool resizeProportionally, Color backgroundColor) すべてのコンテンツを保存するためにカンバを拡張するかどうかを選択し、背景の色が回転によって作成された角を満たすかどうか。

また、クラウド&UI(RESTおよびオンラインツール)が同じ操作を示す場合、サービスやプロトタイプを構築している場合もあります。

Complete Example(コピーパスタ)

この例では、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 うまく働く

  • 典型的なスキャンされたテキスト(ベースライン/エッジ統計を使用して)のスケーウの角度を ** 検出し、1 つの通話で** 回転します。
  • The resizeProportionally オプションは コーナークリップ、および backgroundColor パラメーターは、新しく暴露された領域の フル色 を制御します。

マルチページ TIFF デッキ (何を見るべきか)

  • Run NormalizeAngle ●フレーム* TiffFrame ラスターページであるので、同じAPIが適用されます。
  • 最後に1回保存し、無駄な圧縮(例えば、LZW/Deflate for RGB、CCITT Group 4 for bilevel)を考慮してください。
  • 後で OCR を計画している場合は、小さなグリフを保存するために 300 dpi (またはそれ以上) のページを保持します。

一般的なデッキウイルス - そしてそれらを避ける方法

  • 回転後のクローピングカンバを伸ばせずに回転すると、角が切れます。 NormalizeAngle(true, Color.White) ●「割り当て」を比例する。

  • 汚い背景が角度検出器をトリックする重い騒音またはグラディエントは角度の推定を逆転させることができます ** 光の正常化** (対比のスイッチやグレイスケール) デッキする前に、しかし、薄い衝撃を排除する強いブレアを避ける。

  • ◎超ビナリズムデッキ*硬い限界制限は、ハッキングベーゼルンを生み出すことができます; まず、必要に応じてOCRのためにバイナリ化します。

  • バルコードのスキャンはステップアングルで*バーコードが再開後に失敗した場合は、角度が満たされていないことを確認します; 非常に薄いショットは、メタデータ(EXIF)による初期回転/フリップを必要とする場合があります。 NormalizeAngle.

FAQ

Q:デッキは画像のサイズを変更しますか?**A:もしあなたが通り過ぎるなら resizeProportionally: true, カンバは、すべてのコンテンツを保存するのに十分に成長します - 掘り出さない - 新しい角をあなたの選択した色で満たします。

Q:私は最初に角度を検出することができますか?A: Deskew は通常、単一ショットです。 NormalizeAngleしかし、分析のための角度が必要な場合は、関連するAPIを使用して測定することができます(例えば、OCR製品は角度計算を暴露します)。

Q:クラウド/RESTとは?A: Aspose.Imaging Cloud は、 deskew .NET ライブラリを使用する代わりにサービスを構築している場合の終了点。

Takeaways

  • **SkewはOCR、バーコード読み込み、およびランキング分析を傷つけます。
  • Aspose.ImagingのRasterImage.NormalizeAngleは、一つの通話で迅速かつ信頼性の高い修正を提供し、コンテンツの境界線を保護するオプションも提供します。
  • 複数のページの TIFF のために gentle preprocessing (オプション) と per-page deskew を組み合わせて、正確さを最大限にします。

これらの実践により、あなたの .NET アプリケーションはより明るく、より読みやすいスキャンを生成し、ダウンストリームの OCR とバーコードのステージはあなたに感謝します。

More in this category