“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)GetSkewAngle
Gö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 vebackgroundColor
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.
- Dönüşümden sonra çarpışma*Kanvası genişletmeden döndürüyorsanız, köşeler kesilir.
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
.
- 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.
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 NormalizeAngle
Ancak, 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
- Aspose.Imaging ile .NET'te animasyon GIF'leri optimize etmek
- Aspose ile .NET'te arşiv için çok sayfalık TIFF'leri optimize edin
- Aspose.Imaging ile .NET'te veri yönlendirilmiş animasyonlar
- Aspose.Imaging ile C#'da TIFF'yi PDF'ye dönüştürmek
- E-Ticaret Platformları için Ürün Görüntüleri Aspose.Imaging için .NET