“Desk” nedir (ve neden önemlidir)

Skew, bir belgeyi hafif bir açıdan (genellikle ±0-5°) taradığında veya fotoğrafladığında gerçekleşir. sonuç: metin çizgileri yatay değildir, dikey kenarlar yapıştırılır ve görüntü ince bir dönüştürülür. Deskev Çizgi açıyı tespit etmek ve görüntü geri dönmek Böylece çizgiler yine yatay/vertikal hale gelir.

Püskürtme çubuğunuza nasıl zarar veriyor

  • OCR doğruluğu düşer: yapışkan baselinler segmentasyon, çizgi bulma ve karakter sınıflandırma engeller; küçük açılar doğruluk önemli ölçüde azaltabilir.
  • Barcodlar dekore edemez: Birçok lineer sembol (örneğin, Kod 128/39) dönme duyarlıdır; aşırı kaydırma başarılı okuma azaltır.
  • Croping & layout detection break: sayfa kenarı tespit ve masa çizgisi tespiti genellikle neredeyse düzgün geometri kabul eder.

Nasıl Aspose.Imaging düzeltmek skw — doğru

Aspose.Imaging, raster görüntüleri üzerinde bir çağrı çubuğu sergiliyor:

  • RasterImage.NormalizeAngle() - otomatik olarak kayma açıını tespit eder (girişsel olarak kullanılır) GetSkewAngleGörüntüyü yerinde döndürür.
  • aşırı yükleme : NormalizeAngle(bool resizeProportionally, Color backgroundColor) - Tüm içeriği korumak için kanvası genişletmek için seçin ve hangi ** arka plan rengi** dönüşle oluşturulan köşeleri doldurur.

Ayrıca Cloud & UI eşleri (REST ve çevrimiçi araçlar) aynı işlemi ortaya çıkarır, eğer hizmet veya prototip inşa ediyorsanız.

Tam Örnek (Copy-Paste)

Bu örnek, Aspose.Imaging ile güvenli bir ön işleme ve dayanıklı çubuk gösterir:

  • Bir tarama yükleme (JPG / PNG / TIFF)
  • Seçmeli olarak grayscale dönüştürür ve daha iyi açı tespiti için kontrast normalleştirir.
  • Calls NormalizeAngle(resizeProportionally: true, background: White).
  • Güçlü görüntüyi kurtarır.
  • Bonus: her sayfanın bir çok sayfa TIFF’de nasıl kaydırılacağını gösterir.
  • İhtiyaçlar *
  • .NET 8 (veya 6+)
  • Nükleer : 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 iyi çalışıyor

  • ** tipik tarama metni için kaydırma açıını ** tespit eder (baseline/edge istatistikleri kullanarak) ve ** rotates** tek bir çağrıda.
  • The için resizeProportionally seçeneği corner clipping engeller ve backgroundColor Parametreler yeni maruz kalan bölgelerin ** doldurma rengi** kontrol eder.

Multi-page TIFF deskew (ne izlemek için)

  • Run NormalizeAngle * Bir çerçeve için * TiffFrame bir raster sayfasıdır, bu yüzden aynı API geçerlidir.
  • Sonunda bir kez kaydedin; bir kayıp kompres düşünün (örneğin, RGB için LZW/Deflate, bilevel için CCITT Grubu 4).
  • Daha sonra OCR’ye gitmeyi planlıyorsanız, küçük glyph’leri korumak için sayfaları 300 dpi (veya daha yüksek) tutun.

Sık görülen çamur patlamaları - ve onları nasıl önleyeceğiz

    • Dönüşümden sonra çarpışma*Kanvası genişletmeden döndürüyorsanız, köşeler kesilir. NormalizeAngle(true, Color.White) * Orantılı olarak geri çekilmelidir.
  • Kötü arka planlar açı dedektörü çarpıyorAğır gürültü veya gradientler açı tahminini bozabilir. ** ışık normalleştirme** yapın (kontrast çubuk veya gri ölçeği) çarpmadan önce, ancak ince atışları ortadan kaldırmak için şiddetli mantarlardan kaçının.

  • Daha fazla binaryasyon çerçevesiSert çerçeveyi oluşturabilir; öncelikle kaydırın, sonra gerekirse OCR için ikili yapın. (OCR talimatı, boru hattında erken düzeltmeyi vurgulamaktadır.)

    • Barkod taramaları steep angles*Eğer çubuk kodları hala bozulduktan sonra başarısız olursa, köşesi doymamış olduğundan emin olun; çok ince çekimler başlangıç metadata (EXIF) ile dönüş/flip gerekebilir. NormalizeAngle.

FAQ’lar

Q: Deskew resim boyutunu değiştiriyor mu?* A: * Eğer geçiyorsanız resizeProportionally: true, kanvaslar, tüm içeriği - tahrip etmez - seçtiğiniz renkle yeni köşeleri doldurmak için yeterince büyür.

Q: İlk olarak köşeleri tespit edebilir miyim?A: Deskew tipik olarak tek atış ile NormalizeAngleAncak, analiz için açılara ihtiyacınız varsa, ilgili API’leri kullanarak ölçebilirsiniz (örneğin, OCR ürünleri açı hesaplamasına maruz kalır).

Q: Bulut / REST hakkında ne düşünüyorsunuz?A: Aspose.Imaging Cloud bir deskew .NET kütüphanesini kullanmak yerine bir hizmet inşa ediyorsanız son nokta.

Takeaways

  • Skew OCR, çubuk kodu okuma ve düzen analizi için zarar verir.
  • Aspose.Imaging’in RasterImage.NormalizeAngle size tek bir arama ile hızlı ve güvenilir bir düzeltme ve içerik sınırlarını korumak için seçenekler sunar.
  • gentle preprocessing (seçmeli) ile per-page deskew için çok sayfa TIFF’leri en üst düzeyde hassasiyet için birleştirin.

Bu uygulamalarla, .NET uygulamaları daha keskin, daha okunabilir taramalar üretecek ve aşağı akış OCR ve çubuk kodu aşamaları size teşekkür edecektir.

More in this category