Spaces:
Sleeping
Sleeping
| """OCR (Optical Character Recognition) for extracting text from images.""" | |
| import pytesseract | |
| from PIL import Image | |
| import io | |
| import os | |
| from pathlib import Path | |
| # Configure Tesseract path for Windows (adjust if needed) | |
| # For Windows: Download from https://github.com/UB-Mannheim/tesseract/wiki | |
| # Default installation path: | |
| if os.name == 'nt': # Windows | |
| pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' | |
| def extract_text_from_image(image_data: bytes, language: str = 'eng') -> str: | |
| """ | |
| Extract text from an image using OCR. | |
| Args: | |
| image_data: Image file bytes | |
| language: Language code for OCR | |
| 'eng' = English | |
| 'urd' = Urdu | |
| 'eng+urd' = Both | |
| Returns: | |
| Extracted text string | |
| """ | |
| try: | |
| # Open image from bytes | |
| image = Image.open(io.BytesIO(image_data)) | |
| # Convert to RGB if necessary | |
| if image.mode != 'RGB': | |
| image = image.convert('RGB') | |
| # Perform OCR | |
| text = pytesseract.image_to_string(image, lang=language) | |
| # Clean up extracted text | |
| text = text.strip() | |
| if not text: | |
| raise ValueError("No text detected in image") | |
| return text | |
| except Exception as e: | |
| raise RuntimeError(f"OCR failed: {str(e)}") | |
| def get_supported_languages() -> dict: | |
| """ | |
| Get list of supported OCR languages. | |
| Returns: | |
| Dictionary of language codes and names | |
| """ | |
| return { | |
| 'eng': 'English', | |
| 'urd': 'Urdu', | |
| 'ara': 'Arabic', | |
| 'hin': 'Hindi', | |
| 'eng+urd': 'English + Urdu (Mixed)', | |
| } | |
| def validate_image(image_data: bytes) -> bool: | |
| """ | |
| Validate if the data is a valid image. | |
| Args: | |
| image_data: Image file bytes | |
| Returns: | |
| True if valid image, False otherwise | |
| """ | |
| try: | |
| image = Image.open(io.BytesIO(image_data)) | |
| image.verify() | |
| return True | |
| except Exception: | |
| return False | |
| def preprocess_image(image_data: bytes) -> bytes: | |
| """ | |
| Preprocess image for better OCR accuracy. | |
| Applies grayscale conversion and contrast enhancement. | |
| Args: | |
| image_data: Original image bytes | |
| Returns: | |
| Preprocessed image bytes | |
| """ | |
| try: | |
| from PIL import ImageEnhance | |
| image = Image.open(io.BytesIO(image_data)) | |
| # Convert to grayscale | |
| image = image.convert('L') | |
| # Enhance contrast | |
| enhancer = ImageEnhance.Contrast(image) | |
| image = enhancer.enhance(2.0) | |
| # Save to bytes | |
| output = io.BytesIO() | |
| image.save(output, format='PNG') | |
| return output.getvalue() | |
| except Exception as e: | |
| # Return original if preprocessing fails | |
| return image_data | |