textlens-ocr / utils /image_utils.py
GoConqurer's picture
first commit
1691ca8
raw
history blame
2.77 kB
"""
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()