Taranmış Belgeler İçin OCR
pytesseract aracılığıyla Tesseract, görüntü ön işleme ve doğruluğu artırma.
Taranmış Belgeler İçin OCR, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
OCR Ne Zaman Gereklidir
Her belge dijital olarak oluşturulmuş PDF değildir. Taranmış belgeler, metin fotoğrafları, el yazısı notlar ve görüntü tabanlı PDF'ler metin çıkarmak için Optik Karakter Tanıma (OCR) gerektirir.
OCR, metin içeren piksel görüntülerini makinelerin okuyabileceği karakterlere dönüştürür. Önde gelen iki Python kitaplığı şunlardır: pytesseract (Google Tesseract) ve EasyOCR (derin öğrenme, çok dilli).
pytesseract Temelleri
pytesseract, Google'ın Tesseract OCR motoru için bir Python sarmalayıcısıdır. Önce Tesseract'ı işletim sistemi düzeyinde yükleyin, ardından pip install pytesseract Pillow komutunu çalıştırın.
import pytesseract
from PIL import Image
# Simple text extraction
image = Image.open('scanned_document.png')
text = pytesseract.image_to_string(image)
print(text)
# Specify language (default: English)
text_fr = pytesseract.image_to_string(
Image.open('french_doc.png'),
lang='fra'
)
# Get detailed output with bounding boxes
data = pytesseract.image_to_data(
image,
output_type=pytesseract.Output.DICT
)
for i, word in enumerate(data['text']):
if word.strip():
conf = data['conf'][i]
print(f'Word: {word!r:20} Confidence: {conf}')Görüntü Ön İşleme: Gri Tonlama
OCR doğruluğu büyük ölçüde görüntü kalitesine bağlıdır. İlk ön işleme adımı, görüntüyü gri tonlamaya dönüştürmektir; renk, karakterlerin tanınmasına yardımcı olmadan gürültü ekler.
Ön işleme için Pillow veya OpenCV kullanın. Gri tonlama, gürültüyü azaltır ve Tesseract'ın karakter sınırlarını algılamasını iyileştirir.
from PIL import Image, ImageOps
import numpy as np
def preprocess_grayscale(image_path):
img = Image.open(image_path)
# Convert to grayscale
img = img.convert('L') # 'L' = 8-bit grayscale
# Optionally resize for better OCR (Tesseract works best at ~300 DPI)
# Scale up small images
width, height = img.size
if width < 800:
scale = 800 / width
new_size = (int(width * scale), int(height * scale))
img = img.resize(new_size, Image.LANCZOS)
return img
img = preprocess_grayscale('scan.jpg')
text = pytesseract.image_to_string(img)
print(text[:300])Görüntü Ön İşleme: Eşikleme
Eşikleme, gri tonlamalı bir görüntüyü tamamen siyah ve beyaza dönüştürür. Bu işlem gri gölgeleri, düzensiz aydınlatmayı ve arka plan gürültüsünü kaldırarak metnin OCR için keskin biçimde öne çıkmasını sağlar.
from PIL import Image, ImageFilter
import numpy as np
def apply_threshold(img):
# Method 1: Simple fixed threshold
img_array = np.array(img)
threshold = 128
binary = np.where(img_array > threshold, 255, 0).astype(np.uint8)
return Image.fromarray(binary)
def adaptive_threshold(img):
# Method 2: Otsu's method via OpenCV (better for uneven lighting)
try:
import cv2
img_array = np.array(img)
_, binary = cv2.threshold(
img_array, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
return Image.fromarray(binary)
except ImportError:
return apply_threshold(img)
img = preprocess_grayscale('uneven_scan.png')
img_clean = adaptive_threshold(img)
text = pytesseract.image_to_string(img_clean)
print(text[:300])Görüntü Ön İşleme: Eğiklik Düzeltme
Taranmış belgeler çoğu zaman biraz döndürülmüş olur. Yalnızca 2 derecelik bir eğim bile OCR doğruluğunu önemli ölçüde azaltır. Eğiklik düzeltme, görüntüyü OCR motoruna göndermeden önce döndürme açısını algılar ve düzeltir.
import numpy as np
from PIL import Image
def deskew(img):
try:
import cv2
img_array = np.array(img)
# Find rotation angle using Hough line transform
edges = cv2.Canny(img_array, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
if lines is None:
return img # no lines detected, return unchanged
angles = []
for line in lines:
rho, theta = line[0]
angle = np.degrees(theta) - 90
if -45 < angle < 45:
angles.append(angle)
if not angles:
return img
median_angle = np.median(angles)
if abs(median_angle) > 0.5: # only deskew if significant tilt
print(f'Deskewing by {median_angle:.2f} degrees')
return img.rotate(-median_angle, expand=True, fillcolor=255)
return img
except ImportError:
return img # OpenCV not available — skip deskewTesseract Dil Seçenekleri
Tesseract 100'den fazla dili destekler. Dil paketlerini işletim sisteminizin paket yöneticisiyle indirin. Birden fazla dil içeren belgelerde, dilleri + ayıracıyla belirtin.
import pytesseract
from PIL import Image
# List available languages
import subprocess
result = subprocess.run(['tesseract', '--list-langs'], capture_output=True, text=True)
print('Available languages:')
print(result.stdout)
# Single language
text_en = pytesseract.image_to_string(Image.open('doc.png'), lang='eng')
# Multiple languages (auto-detect best match)
text_multi = pytesseract.image_to_string(
Image.open('doc.png'),
lang='eng+fra+deu' # English + French + German
)
# Tesseract config options for better accuracy
custom_config = r'--oem 3 --psm 6' # OEM 3=LSTM, PSM 6=assume uniform block of text
text_tuned = pytesseract.image_to_string(
Image.open('doc.png'),
config=custom_config
)EasyOCR: Derin Öğrenme Tabanlı
EasyOCR, derin öğrenme modelleri kullanır ve bozulmuş görüntülerde, eğri metinlerde ve Latin alfabesi dışındaki yazı sistemlerinde Tesseract'tan daha iyi sonuç verir. İşletim sistemi düzeyinde kurulum gerektirmez.
pip install easyocr komutuyla yükleyin. İlk çalıştırmada model ağırlıkları (~200 MB) indirilir.
import easyocr
# Initialize reader (downloads model on first run)
reader = easyocr.Reader(
['en', 'tr'], # list of languages
gpu=False # set True if CUDA available
)
# Read text from image
results = reader.readtext('scanned_page.png')
for (bbox, text, confidence) in results:
print(f'Text: {text!r:30} Confidence: {confidence:.2f}')
# bbox = [[x1,y1],[x2,y2],[x3,y3],[x4,y4]] (four corners)
# Get plain text only
text_only = ' '.join(result[1] for result in results)
print('Full text:', text_only[:300])Çok Dilli Belgeler İçin EasyOCR
EasyOCR, birden fazla dilin kullanıldığı belgeleri iyi işler. Bu özellik uluslararası sözleşmeler, birden fazla dilde açıklamalar içeren araştırma makaleleri veya teknik terimleri farklı bir yazı sisteminde bulunan belgeler için kullanışlıdır.
import easyocr
# For Arabic-English mixed document
reader_ar = easyocr.Reader(['ar', 'en'], gpu=False)
results = reader_ar.readtext('arabic_contract.png')
# For CJK languages
reader_cjk = easyocr.Reader(['ch_sim', 'en'], gpu=False) # Simplified Chinese + English
results_cjk = reader_cjk.readtext('chinese_report.png')
# Filter by confidence threshold
HIGH_CONFIDENCE = 0.7
def filter_confident_results(results, threshold=HIGH_CONFIDENCE):
return [
(bbox, text, conf)
for bbox, text, conf in results
if conf >= threshold
]Tam Ön İşleme İşlem Hattı
Gri tonlama, eşikleme ve eğiklik düzeltme gibi tüm ön işleme adımlarını tek bir işlem hattı işlevinde birleştirin. OCR'yi temizlenmiş görüntü üzerinde çalıştırın ve hem metni hem de güven ölçümlerini döndürün.
import pytesseract
from PIL import Image
def ocr_pipeline(image_path, lang='eng', engine='tesseract'):
print(f'Processing: {image_path}')
# 1. Load
img = Image.open(image_path)
# 2. Preprocess
img = img.convert('L') # grayscale
img = adaptive_threshold(img) # binarize
img = deskew(img) # correct rotation
# 3. OCR
if engine == 'easyocr':
reader = easyocr.Reader([lang], gpu=False)
results = reader.readtext(image_path)
text = ' '.join(r[1] for r in results if r[2] > 0.5)
else:
config = f'--oem 3 --psm 6 -l {lang}'
text = pytesseract.image_to_string(img, config=config)
# 4. Clean
text = '\n'.join(
line.strip() for line in text.splitlines()
if line.strip()
)
return text
text = ocr_pipeline('invoice_scan.jpg')
print(text[:500])Görüntü Tabanlı PDF'leri İşleme
Bazı PDF'ler, PDF kapsayıcısının içinde görüntü olarak saklanan taranmış sayfalar içerir. Bu «görüntü tabanlı PDF'leri» algılayın ve önce PyMuPDF ile görüntüleri çıkararak her sayfaya ayrı ayrı OCR uygulayın.
import fitz
from PIL import Image
import io
import pytesseract
def is_image_pdf(doc):
# Check if first page has very little extractable text
text = doc[0].get_text().strip()
return len(text) < 50
def ocr_pdf(filepath):
doc = fitz.open(filepath)
if not is_image_pdf(doc):
# Native text — no OCR needed
return '\n'.join(doc[i].get_text() for i in range(len(doc)))
print('Image PDF detected — running OCR')
all_text = []
for page_num in range(len(doc)):
page = doc[page_num]
# Render page as image at 300 DPI
mat = fitz.Matrix(300/72, 300/72) # scale to 300 DPI
pix = page.get_pixmap(matrix=mat)
img = Image.open(io.BytesIO(pix.tobytes('png')))
text = pytesseract.image_to_string(img)
all_text.append(f'--- Page {page_num+1} ---\n{text}')
doc.close()
return '\n'.join(all_text)Güven Düzeyine Göre Filtreleme ve Son İşleme
OCR çıktısı, özellikle bozulmuş görüntülerde hatalar içerir. Düşük güven düzeyine sahip kelimeleri filtreleyerek, yaygın OCR hatalarını düzelterek (0 yerine O, 1 yerine l gibi) ve boşlukları normalleştirerek metne son işleme uygulayın.
import re
COMMON_OCR_ERRORS = {
r'\b0([a-z])\b': r'O\1',
r'\bl([0-9])\b': r'1\1',
r'\|': 'I',
r' +': ' ',
}
def post_process_ocr(text):
for pattern, replacement in COMMON_OCR_ERRORS.items():
text = re.sub(pattern, replacement, text)
lines = [line.strip() for line in text.splitlines()]
return '\n'.join(line for line in lines if line)
def high_confidence_ocr(words_with_conf, min_confidence=60):
words = [w for w, conf in words_with_conf if w.strip() and conf >= min_confidence]
return post_process_ocr(' '.join(words))
fake_ocr_output = [('0range', 90), ('|s', 40), ('l5', 85), ('good', 95)]
print(high_confidence_ocr(fake_ocr_output))Bilgi Kontrolü
OCR'den önce bir görüntüye eşikleme (ikileştirme) uygulamanın amacı nedir?
Tekrar: Taranmış Belgeler İçin OCR
OCR, taranmış görüntüleri makinelerin okuyabileceği metne dönüştürür. pytesseract, Google Tesseract'ı sarmalar; 100'den fazla dil paketiyle hızlı ve olgundur. EasyOCR derin öğrenme kullanır ve bozulmuş görüntülerle çok dilli metinleri daha iyi işler.
Her zaman ön işleme uygulayın: gri tonlamaya dönüştürün, ikileştirme için Otsu eşiklemesini uygulayın ve döndürmeyi düzeltmek için eğikliği giderin. Görüntü tabanlı PDF'lerde sayfaları PyMuPDF ile yüksek DPI değerine sahip görüntüler olarak oluşturun, ardından OCR çalıştırın. Gürültüyü dışlamak için sonuçları güven eşiğine göre filtreleyin.
Sıkça Sorulan Sorular
“Taranmış Belgeler İçin OCR” dersi ücretsiz mi?
Evet — “Taranmış Belgeler İçin OCR” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Taranmış Belgeler İçin OCR” dersinde ne öğreneceğim?
pytesseract aracılığıyla Tesseract, görüntü ön işleme ve doğruluğu artırma. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Taranmış Belgeler İçin OCR” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- PyMuPDF ve pdfplumber ile PDF Ayrıştırma
- Taranmış Belgeler İçin OCR
- Çok Belgeli Soru-Cevap Aracıları
- Belge Sınıflandırma ve Yönlendirme