File size: 3,842 Bytes
5eab8c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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:
        # Highlight the keyword by wrapping it with a span tag
        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()

    # Initialize session state variables
    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:  # Check if OCR has been performed
            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()