BuddyMath / utils /image_processor.py
dotandru's picture
V5.13.14: OCR Reliability Layer (Upscaling/Binarization) and temperature=0.0 enforcement
f06fc7f
Raw
History Blame Contribute Delete
1.48 kB
import cv2
import numpy as np
def enhance_image_for_math_ocr(image_bytes: bytes) -> bytes:
"""
Upscales and binarizes an image to improve OCR accuracy for math equations.
V5.13.14: Added OpenCV Pre-processing layer as requested.
"""
try:
# Decode the image bytes to OpenCV format
nparr = np.frombuffer(image_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img is None:
return image_bytes # Fallback if decode fails
# 1. Upscale 2x using Cubic Interpolation for smoother edges
img = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# 2. Convert to Grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 3. Apply slight Gaussian Blur to remove noise before thresholding
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 4. Adaptive Thresholding - turns paper to pure white and ink to pure black
binary = cv2.adaptiveThreshold(
blurred,
255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
11, 2
)
# Encode back to JPEG bytes (using .jpg as requested)
success, encoded_image = cv2.imencode('.jpg', binary)
if success:
return encoded_image.tobytes()
return image_bytes
except Exception as e:
print(f"⚠️ [IMAGE ENHANCEMENT FAILED]: {e}. Using original image.")
return image_bytes