| import streamlit as st |
| import cv2 |
| import numpy as np |
| import easyocr |
| import re |
| from langdetect import detect_langs |
| from PIL import Image |
| import io |
|
|
| def load_easyocr_reader(): |
| return easyocr.Reader(['hi', 'en'], gpu=False) |
|
|
| def preprocess_image(image): |
| img_array = np.array(image.convert('RGB')) |
| gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY) |
| denoised = cv2.fastNlMeansDenoising(gray, None, 10, 7, 21) |
| thresh = cv2.adaptiveThreshold(denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) |
| kernel = np.ones((1, 1), np.uint8) |
| dilated = cv2.dilate(thresh, kernel, iterations=1) |
| return dilated |
|
|
| def perform_easyocr(image, reader): |
| preprocessed_image = preprocess_image(image) |
| results = reader.readtext(preprocessed_image, paragraph=True, detail=0, |
| contrast_ths=0.2, adjust_contrast=0.5, |
| add_margin=0.1, width_ths=0.7, height_ths=0.7) |
| extracted_text = ' '.join(results) |
| return extracted_text |
|
|
| def detect_languages(text): |
| cleaned_text = re.sub(r'[^a-zA-Z\u0900-\u097F\s]', '', text) |
| cleaned_text = re.sub(r'\s+', ' ', cleaned_text).strip() |
| |
| if not cleaned_text: |
| return [] |
| try: |
| langs = detect_langs(cleaned_text) |
| detected = [] |
| for lang in langs: |
| if lang.lang == 'hi' and lang.prob > 0.1: |
| detected.append('Hindi') |
| elif lang.lang == 'en' and lang.prob > 0.1: |
| detected.append('English') |
| return detected |
| except: |
| return fallback_language_check(cleaned_text) |
|
|
| def fallback_language_check(text): |
| hindi_range = range(0x0900, 0x097F) |
| english_range = range(0x0041, 0x007A) |
| |
| has_hindi = any(ord(char) in hindi_range for char in text) |
| has_english = any(ord(char) in english_range for char in text) |
| |
| detected = [] |
| if has_hindi: |
| detected.append('Hindi') |
| if has_english: |
| detected.append('English') |
| |
| return detected |
|
|
| def highlight_text(text, keywords): |
| for keyword in keywords: |
| |
| text = re.sub(f'({re.escape(keyword)})', r'<span style="background-color: yellow;">\1</span>', text, flags=re.IGNORECASE) |
| return text |
|
|
| def main(): |
| st.title("OCR for Hindi and English") |
|
|
| easyocr_reader = load_easyocr_reader() |
|
|
| |
| if 'extracted_text' not in st.session_state: |
| st.session_state.extracted_text = "" |
|
|
| uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) |
| if uploaded_file is not None: |
| image = Image.open(uploaded_file) |
| st.image(image, caption='Uploaded Image', use_column_width=True) |
|
|
| if st.button('Perform OCR'): |
| with st.spinner('Processing...'): |
| st.session_state.extracted_text = perform_easyocr(image, easyocr_reader) |
| |
| st.subheader("Extracted Text:") |
| st.write(st.session_state.extracted_text) |
| |
| languages_detected = detect_languages(st.session_state.extracted_text) |
| if languages_detected: |
| st.write("Detected languages:", ', '.join(languages_detected)) |
| else: |
| st.write("No languages detected.") |
|
|
| if st.session_state.extracted_text: |
| st.subheader("Search in Extracted Text") |
| search_query = st.text_input("Enter keywords to search:", "") |
| if search_query: |
| keywords = search_query.split() |
| highlighted_text = highlight_text(st.session_state.extracted_text, keywords) |
| st.markdown(highlighted_text, unsafe_allow_html=True) |
|
|
| if __name__ == "__main__": |
| main() |