Spaces:
Running
Running
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() |