textlens-ocr / utils /image_utils.py
GoConqurer's picture
first commit
1691ca8
"""
Image utilities for TextLens OCR application.
"""
from PIL import Image, ImageEnhance, ImageFilter
from typing import Tuple, Optional, Union
import io
import logging
logger = logging.getLogger(__name__)
# Supported image formats
SUPPORTED_FORMATS = {'JPEG', 'PNG', 'WEBP', 'BMP', 'TIFF', 'GIF'}
def validate_image(image: Union[Image.Image, str, bytes]) -> bool:
"""Validate if the input is a valid image."""
try:
if isinstance(image, Image.Image):
return image.format in SUPPORTED_FORMATS
elif isinstance(image, str):
with Image.open(image) as img:
return img.format in SUPPORTED_FORMATS
elif isinstance(image, bytes):
with Image.open(io.BytesIO(image)) as img:
return img.format in SUPPORTED_FORMATS
return False
except Exception:
return False
def preprocess_image(image: Image.Image, target_size: Optional[Tuple[int, int]] = None) -> Image.Image:
"""Preprocess image for optimal OCR results."""
try:
if image.mode != 'RGB':
image = image.convert('RGB')
if target_size:
image = resize_image(image, target_size)
return image
except Exception as e:
logger.error(f"Error preprocessing image: {str(e)}")
return image
def resize_image(image: Image.Image, target_size: Tuple[int, int], maintain_aspect: bool = True) -> Image.Image:
"""Resize image to target size."""
try:
if maintain_aspect:
image.thumbnail(target_size, Image.Resampling.LANCZOS)
else:
image = image.resize(target_size, Image.Resampling.LANCZOS)
return image
except Exception as e:
logger.error(f"Error resizing image: {str(e)}")
return image
def enhance_image_for_ocr(image: Image.Image) -> Image.Image:
"""Enhance image quality for better OCR results."""
try:
enhancer = ImageEnhance.Contrast(image)
image = enhancer.enhance(1.2)
enhancer = ImageEnhance.Sharpness(image)
image = enhancer.enhance(1.1)
return image
except Exception as e:
logger.error(f"Error enhancing image: {str(e)}")
return image
def convert_format(
image: Image.Image,
target_format: str = 'PNG'
) -> bytes:
"""
Convert image to specified format.
Args:
image: PIL Image object
target_format: Target format (PNG, JPEG, etc.)
Returns:
bytes: Image data in target format
TODO: Implement format conversion with optimization
"""
# TODO: Implement format conversion
buffer = io.BytesIO()
image.save(buffer, format=target_format)
return buffer.getvalue()