opencode/preprocess_for_ocr.py

52 lines
1.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Предобработка PNG для улучшения OCR размерных чисел.
Алгоритм:
1. CLAHE локальное повышение контраста
2. Unsharp mask повышение резкости
3. Инвертирование (опционально для некоторых OCR)
4. Масштабирование x2 (если исходное маленькое)
"""
import sys
from pathlib import Path
import cv2
import numpy as np
def preprocess_for_ocr(img_path: Path, out_path: Path, scale: float = 2.0):
img = cv2.imread(str(img_path), cv2.IMREAD_GRAYSCALE)
if img is None:
raise RuntimeError(f"Cannot load {img_path}")
# Масштабирование
if scale != 1.0:
h, w = img.shape
img = cv2.resize(img, (int(w*scale), int(h*scale)), interpolation=cv2.INTER_CUBIC)
# CLAHE (локальный контраст)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
img = clahe.apply(img)
# Unsharp mask
gaussian = cv2.GaussianBlur(img, (0,0), 3)
img = cv2.addWeighted(img, 1.5, gaussian, -0.5, 0)
# Нормализация
img = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX)
cv2.imwrite(str(out_path), img)
print(f"[OK] Предобработка сохранена: {out_path}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python preprocess_for_ocr.py <png>")
sys.exit(1)
png = Path(sys.argv[1])
out = png.parent / f"{png.stem}_preproc.png"
preprocess_for_ocr(png, out)