Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import cv2 | |
| import pytesseract | |
| from googletrans import Translator | |
| from PIL import Image, ImageDraw, ImageFont | |
| import numpy as np | |
| # Step 1: Load the image | |
| def load_image(image_file): | |
| # Read the image using OpenCV | |
| img = cv2.imdecode(np.fromstring(image_file.read(), np.uint8), cv2.IMREAD_COLOR) | |
| return img | |
| # Step 2: Extract text and coordinates using pytesseract | |
| def extract_text_with_position(image): | |
| # Convert the image to grayscale for better OCR performance | |
| gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
| # Use pytesseract to get OCR results along with bounding boxes | |
| details = pytesseract.image_to_data(gray_image, output_type=pytesseract.Output.DICT) | |
| text_data = [] | |
| for i in range(len(details['text'])): | |
| if details['text'][i].strip() != '': | |
| text_data.append({ | |
| 'text': details['text'][i], | |
| 'left': details['left'][i], | |
| 'top': details['top'][i], | |
| 'width': details['width'][i], | |
| 'height': details['height'][i] | |
| }) | |
| return text_data | |
| # Step 3: Translate the extracted text using Google Translate | |
| def translate_text(text, target_language='en'): | |
| translator = Translator() | |
| translation = translator.translate(text, dest=target_language) | |
| return translation.text | |
| # Step 4: Recreate the image with translated text | |
| def recreate_image_with_translated_text(original_img, text_data, target_language): | |
| # Convert OpenCV image to Pillow image for easier manipulation | |
| pil_img = Image.fromarray(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB)) | |
| draw = ImageDraw.Draw(pil_img) | |
| try: | |
| # Load a default font (you can use a specific font if you want) | |
| font = ImageFont.load_default() | |
| except IOError: | |
| font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 30) | |
| for item in text_data: | |
| # Translate each piece of text | |
| translated_text = translate_text(item['text'], target_language) | |
| # Draw the translated text on the new image at the same position | |
| draw.text((item['left'], item['top']), translated_text, font=font, fill="black") | |
| # Convert the image back to an OpenCV format | |
| output_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) | |
| return output_img | |
| # Step 5: Display or download the translated image | |
| def display_or_download_image(output_img): | |
| # Convert image to bytes to allow for download | |
| _, img_bytes = cv2.imencode('.png', output_img) | |
| st.image(output_img, channels="BGR", caption="Translated Image", use_column_width=True) | |
| # Provide a button to download the image | |
| st.download_button( | |
| label="Download Translated Image", | |
| data=img_bytes.tobytes(), | |
| file_name="translated_image.png", | |
| mime="image/png" | |
| ) | |
| # Streamlit Interface | |
| def main(): | |
| st.title("Image Translation App") | |
| # Upload image | |
| image_file = st.file_uploader("Upload an image", type=["jpg", "png", "jpeg"]) | |
| if image_file is not None: | |
| # Load the image and show it | |
| img = load_image(image_file) | |
| st.image(img, caption="Uploaded Image", channels="BGR", use_column_width=True) | |
| # Get the target language from the user | |
| target_language = st.text_input("Enter the target language code (e.g., 'es' for Spanish):") | |
| if target_language: | |
| # Extract text from image | |
| text_data = extract_text_with_position(img) | |
| # Recreate the image with translated text | |
| translated_img = recreate_image_with_translated_text(img, text_data, target_language) | |
| # Display or allow download of the translated image | |
| display_or_download_image(translated_img) | |
| if __name__ == "__main__": | |
| main() |