C# İle Resimler Üzerinden Optik Karakter Tanıma Uygulaması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. OCR işlemleri için en güvenilir ve açık kaynaklı motor olan Tesseract'ın .NET uyarlamasını kullanacağız.

  • Visual Studio 2022 veya daha güncel bir sürüm.
  • .NET 9 SDK kurulu olmalıdır.
  • Tesseract kütüphanesi (NuGet üzerinden yüklenecektir).
  • İşlem yapılacak görselin yüksek çözünürlüklü ve net olması (Düşük çözünürlüklü görsellerde başarı oranı düşer).

Projenizi oluşturduktan sonra NuGet Paket Yöneticisi üzerinden şu komutu çalıştırarak gerekli kütüphaneyi projenize dahil edin:

dotnet add package Tesseract

Bu komut, OCR motorunun çekirdek işlevlerini projenize ekler. Tesseract'ın çalışması için ayrıca dil dosyalarına (traineddata) ihtiyacınız olacaktır. Bu dosyaları Tesseract'ın resmi GitHub deposundan indirip projenizin dizinine eklemelisiniz.

Tesseract Motorunu Yapılandırma

Tesseract motorunu başlatmak için bir "Engine" nesnesi oluşturmanız gerekir. Bu nesne, görseli analiz edecek olan yapay zeka modelini belleğe yükler. Motoru yapılandırırken dil ayarlarını ve veri dizini yolunu doğru belirtmek kritik önem taşır.

using Tesseract;

// Motoru başlatma işlemi
var engine = new TesseractEngine(@"./tessdata", "tur", EngineMode.Default);

Burada "tur" parametresi, motorun Türkçe karakterleri tanıması için gerekli olan dil modelini ifade eder. "tessdata" klasöründe "tur.traineddata" dosyasının bulunduğundan emin olun.

Görseli İşleme ve Metin Çıkarımı

OCR işleminin temel adımı, görseli bir Pix (piksel) nesnesine dönüştürmek ve ardından motorun bu görsel üzerinde tarama yapmasını sağlamaktır. Aşağıdaki örnek kod, bir dosya yolundan görseli okur ve metin verisini döndürür.

public string MetniOku(string dosyaYolu)
{
    using (var engine = new TesseractEngine(@"./tessdata", "tur", EngineMode.Default))
    {
        using (var img = Pix.LoadFromFile(dosyaYolu))
        {
            using (var page = engine.Process(img))
            {
                return page.GetText();
            }
        }
    }
}

Bu kod bloğu, görseli belleğe yükler ve Tesseract motorunun görseli analiz ederek metin olarak dışa aktarmasını sağlar. using blokları, işlem bittiğinde bellek sızıntılarını önlemek için nesnelerin düzgün bir şekilde atılmasını (dispose) garanti eder.

OCR Başarısını Artıran Teknikler

Görselin kalitesi OCR başarısını doğrudan etkiler. Eğer görseliniz üzerinde gürültü (noise) varsa veya metinler eğikse, OCR motoru doğru sonuç veremeyebilir. Görüntü ön işleme (preprocessing) aşamasında şu yöntemleri kullanabilirsiniz:

  • Gri Ölçeklendirme: Görseli siyah-beyaza çevirmek karakter belirginliğini artırır.
  • Eşikleme (Thresholding): Arka plan ile yazı arasındaki kontrastı keskinleştirir.
  • Düzeltme (Deskewing): Eğik duran belgeleri hizalar.

Aşağıdaki tablo, farklı OCR yaklaşımlarının karşılaştırmasını sunmaktadır:

Yöntem Avantaj Dezavantaj
Tesseract (Yerel) Ücretsiz, çevrimdışı çalışır Görsel kalitesine çok duyarlı
Cloud API (Azure/AWS) Yüksek başarı oranı Maliyetli, internet bağımlı

Hata Yönetimi ve Güvenlik Uyarıları

OCR uygulamaları geliştirirken dosya erişim hataları ve geçersiz görsel formatları ile sıkça karşılaşabilirsiniz. Kullanıcıdan alınan dosya yollarını doğrudan işlemek, sistem güvenliği açısından riskler barındırabilir.

Kritik Uyarı: Kullanıcıdan gelen dosya yollarını veya içeriklerini asla doğrudan sistem komutlarında çalıştırmayın. Dosya yolu doğrulama (path validation) yaparak, uygulamanızın dizini dışına erişimi engelleyin. Ayrıca, büyük boyutlu görsellerin belleği tüketmesini engellemek için dosya boyutu kontrolü yapın.

public void DosyaKontrol(string dosyaYolu)
{
    if (!File.Exists(dosyaYolu))
        throw new FileNotFoundException("Dosya bulunamadı.");
        
    var uzanti = Path.GetExtension(dosyaYolu).ToLower();
    if (uzanti != ".jpg" && uzanti != ".png")
        throw new InvalidOperationException("Desteklenmeyen dosya formatı.");
}

Sıkça Sorulan Sorular

OCR motoru neden bazı karakterleri yanlış tanıyor?

Genellikle görselin çözünürlüğü düşüktür veya metin fontu Tesseract'ın eğitildiği veri setinde bulunmuyordur. Görseli 300 DPI seviyesine yükseltmek sonuçları iyileştirebilir.

Çok sayfalı PDF dosyaları için OCR nasıl yapılır?

Tesseract doğrudan PDF okuyamaz. Bunun yerine PDF'i önce görsel formatına (örneğin PNG) dönüştüren bir kütüphane (örneğin PdfiumViewer) kullanıp, ardından her sayfayı ayrı ayrı OCR işlemine sokmalısınız.

OCR işlemini nasıl hızlandırabilirim?

Görselin tamamını işlemek yerine, sadece metin içeren bölgeleri (Region of Interest) kırparak (crop) işleme alırsanız işlem süresi ciddi oranda kısalacaktır.

GPU hızlandırma kullanabilir miyim?

Tesseract temel olarak CPU odaklıdır. Çok yüksek performans gerektiren durumlarda GPU destekli alternatif OCR kütüphaneleri veya bulut tabanlı servisler tercih edilmelidir.

Türkçe karakter desteği için ne yapmalıyım?

Tesseract'ın "tur.traineddata" dosyasını projenizdeki "tessdata" klasörüne eklediğinizden ve motoru başlatırken "tur" parametresini kullandığınızdan emin olun.

OCR Çıktılarını Yapılandırılmış Veriye Dönüştürme

OCR işleminden elde edilen ham metinler genellikle düzensizdir. Gerçek dünya uygulamalarında, bu metinleri işlenebilir bir formata (JSON gibi) dönüştürmek, verinin veritabanına kaydedilmesi veya analiz edilmesi için kritiktir. Aşağıdaki örnek, Tesseract çıktısını basit bir Regex (Düzenli İfadeler) yöntemiyle nasıl ayrıştırabileceğinizi göstermektedir.

using System;
using System.Text.RegularExpressions;
using Newtonsoft.Json;

public class OcrResultParser
{
    public static string ParseToInvoiceJson(string rawText)
    {
        // Örnek: Fatura numarası yakalama
        var match = Regex.Match(rawText, @"Fatura No:\s*(\d+)");
        string invoiceNo = match.Success ? match.Groups[1].Value : "Bilinmiyor";

        var data = new {
            InvoiceNumber = invoiceNo,
            ExtractedAt = DateTime.Now,
            RawContent = rawText
        };

        return JsonConvert.SerializeObject(data, Formatting.Indented);
    }
}

OCR Uygulamalarında Performans Optimizasyonu ve Ölçeklendirme

OCR işlemleri CPU yoğunluklu süreçlerdir. Özellikle yüksek çözünürlüklü görsellerde veya toplu işlem gerektiren senaryolarda uygulamanızın yanıt süresini optimize etmek için şu stratejileri izleyebilirsiniz:

  • Görsel Boyutlandırma: OCR öncesi görselleri 300 DPI seviyesine getirin. Gereğinden büyük görseller işleme süresini katlayarak artırır.
  • Asenkron İşleme: Kullanıcı arayüzünün donmaması için OCR işlemlerini Task.Run ile arka plan iş parçacıklarına devredin.
  • Ön İşleme (Preprocessing): Görseli gri tonlamaya (Grayscale) çevirmek ve gürültü giderme (Denoising) filtreleri uygulamak, motorun daha hızlı karar vermesini sağlar.

Asenkron OCR Çalıştırma Örneği

public async Task ProcessOcrAsync(string imagePath)
{
    return await Task.Run(() =>
    {
        using (var engine = new TesseractEngine(@"./tessdata", "tur", EngineMode.Default))
        {
            using (var img = Pix.LoadFromFile(imagePath))
            {
                using (var page = engine.Process(img))
                {
                    return page.GetText();
                }
            }
        }
    });
}

Dağıtım (Deployment) ve Bağımlılık Yönetimi

Uygulamanızı sunucuya veya kullanıcı bilgisayarına dağıtırken, Tesseract'ın ihtiyaç duyduğu yerel kütüphanelerin (liblept.dll ve libtesseract.dll) doğru dizinde olduğundan emin olmalısınız. .NET projelerinde bu dosyalar genellikle NuGet paketi tarafından yönetilir ancak kurulum sonrası şu kontrolleri yapmanız önerilir:

Dosya İşlev
tessdata/tur.traineddata Türkçe dil modeli (Mutlaka bulunmalı)
x64/libtesseract.dll OCR motorunun çekirdek kütüphanesi

Uygulamanızı yayınlarken "Self-Contained" (bağımsız) modda yayınlamak, hedef sistemdeki eksik DLL hatalarının önüne geçecektir. Visual Studio üzerinden "Publish" ayarlarında "Produce single file" seçeneğini işaretleyerek tüm bağımlılıkları tek bir çalıştırılabilir dosya içerisinde paketleyebilirsiniz.

Sonuç

C# ile resimler üzerinden OCR uygulaması geliştirmek, doğru araçlar ve yöntemlerle oldukça verimli bir süreçtir. Tesseract kütüphanesi, yerel uygulamalar için sağlam bir temel sunar. Bu rehberde öğrendiğiniz adımları takip ederek, kendi doküman işleme sisteminizi kurabilir ve verimliliğinizi artırabilirsiniz. Bir sonraki adım olarak, elde ettiğiniz metinleri yapılandırılmış bir formata (JSON veya XML) dönüştüren bir analiz katmanı eklemeyi deneyebilirsiniz.

Yasal Uyarı: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında OCR uygulamaları geliştirirken, kişisel verilerin korunması (KVKK) kanununa uygun hareket etmeli ve işlediğiniz verilerin gizliliğini sağlamalısınız.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Hobi ve kişisel gelişim alanında içerik editörlüğü yapıyorum. Okuyuculara yeni beceriler kazandıran, net ve anlaşılır nasıl yapılır makaleleri yazıyorum.

Yorumlar (0)

Yorum Yaz