Apa itu “deskew” (dan mengapa itu penting)

Skew terjadi ketika sebuah dokumen dipindai atau difotografasikan pada sudut yang ringan (biasanya ±0-5°). hasilnya: garis teks tidak horizontal, tepi vertikal ditarik, dan gambar memiliki putaran halus. Desk adalah proses Mengidentifikasi sudut pergeseran dan memutar gambar kembali Dengan demikian garis-garis menjadi horizontal/vertikal lagi.

Bagaimanakah kecacatan menyakitkan pipa Anda

  • Kecepatan OCR berkurang: basel yang dilipat menghalangi segmensi, penemuan garis, dan klasifikasi karakter; sudut kecil dapat memotong ketepatannya secara dramatis.
  • Barcode gagal mengekodkan: Banyak simbol linear (misalnya, Kod 128/39) sensitif terhadap rotasi; skema berlebihan mengurangi pembacaan yang sukses.
  • Croping & layout detection break: deteksi tepi halaman dan deteksinya garis meja sering menganggap geometri dekat-ortogonal.

Bagaimana Aspose.Imaging memperbaiki skw—secara tepat

Aspose.Imaging mengeksplorasi satu-call deskew pada gambar raster:

  • RasterImage.NormalizeAngle() - mengidentifikasi sudut sking secara otomatis (dengan menggunakan GetSkewAngle3) dan memutar gambar di tempat.
  • Berlebihan beban : NormalizeAngle(bool resizeProportionally, Color backgroundColor) — pilih apakah untuk memperluas kanvas untuk menyimpan semua konten dan warna ** latar belakang** yang mengisi sudut yang dicipta oleh rotasi.

Ada juga Cloud & UI counterparts (REST dan alat online) yang mendedahkan operasi yang sama jika Anda membangun layanan atau prototipe.

Contoh yang lengkap (copy paste)

Contoh ini menunjukkan preprocessing yang aman dan tahan lama dengan Aspose.Imaging:

  • Mengisi scan (JPG / PNG / TIFF)
  • Optional converts to grayscale & normalize contrast untuk deteksi sudut yang lebih baik.
  • Calls NormalizeAngle(resizeProportionally: true, background: White).
  • Menyelamatkan gambar yang tersembunyi.
  • Bonus: menunjukkan bagaimana untuk membongkar setiap halaman dalam TIFF berbilang halaman.
  • Keperluan *
  • .NET 8 (atau 6+)
  • Untuk NuGet: 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 bekerja dengan baik

  • Ini mengidentifikasi sudut sking untuk teks yang dipancarkan tipikal (menggunakan statistik dasar/edge) dan rotates dalam satu panggilan.
  • dan yang resizeProportionally opsi mencegah ** corner clipping**, dan backgroundColor Parameter mengontrol warna ** penuh** dari area yang baru terpapar.

Multi-page TIFF deskew (apa untuk menonton)

  • Run NormalizeAngle * untuk setiap frame *; TiffFrame adalah halaman raster, jadi API yang sama berlaku.
  • Simpan sekali di akhir; pertimbangkan kompresi ** tanpa kerugian** (misalnya, LZW/Deflate untuk RGB, CCITT Group 4 untuk bilevel).
  • Jika Anda berencana untuk OCR kemudian, simpan halaman di 300 dpi (atau lebih tinggi) untuk mempertahankan glyph kecil.

Gejala-gejala yang umum - dan bagaimana untuk menghindari mereka

  • Korupsi setelah rotasiJika Anda berputar tanpa memperluas kanvas, sudut dipotong. NormalizeAngle(true, Color.White) • Mengurangi secara proporsional.

  • ** latar belakang kotor menyesatkan detektor sudutLonceng berat atau gradient dapat membingungkan anggaran sudut. lakukan ** normalisasi cahaya (tanduk kontras atau grayscale) sebelum meluncur, tetapi hindari blurs yang kuat yang menghapus strokes tipis.

    • Perbedaan Binary DeskewHentikan batas keras dapat menciptakan baseline yang tergelincir; terlebih dahulu, kemudian binarisasi untuk OCR jika perlu. (panduan OCR menekankan koreksi skw awal di pipa.)
  • Scan barcode pada sudut yang tajamJika kode bar masih gagal setelah pemadaman, periksa sudut tidak kenyang; tembakan yang sangat tajam mungkin memerlukan rotasi awal/flip oleh metadata (EXIF) sebelum NormalizeAngle.

FAQs

Q: Apakah deskew mengubah ukuran gambar?* A: Jika Anda melewati resizeProportionally: true, kanvas tumbuh cukup untuk menjaga semua konten - tidak menggali - mengisi sudut baru dengan warna yang Anda pilih.

Q: Bolehkah saya mendeteksi sudut terlebih dahulu?**A: Deskew biasanya satu tembakan dengan NormalizeAngleNamun, jika Anda membutuhkan sudut untuk analisis, Anda dapat mengukur menggunakan API yang terkait (misalnya, produk OCR mendedahkan pengiraan angle).

Q: Bagaimana dengan Cloud/REST?A: Aspose.Imaging Cloud mengungkapkan deskew Endpoint jika Anda sedang membangun layanan bukannya menggunakan perpustakaan .NET.

Takeaways

  • Skew menyakitkan OCR, membaca barcode, dan analisis tataletak.
  • Aspose.Imaging RasterImage.NormalizeAngle memberi Anda perbaikan yang cepat dan dapat diandalkan dengan satu panggilan, ditambah pilihan untuk melindungi batas konten.
  • Kombinasi gentle preprocessing (optional) dengan per-page deskew untuk TIFF berbilang halaman untuk memaksimalkan ketepatan.

Dengan praktik ini, aplikasi .NET Anda akan menghasilkan pemindaian yang lebih tajam, lebih mudah dibaca – dan tahap OCR dan barcode Anda turun akan berterima kasih.

More in this category