bLoOd_AI / app.py
erayman09's picture
Update app.py
b97a1bd verified
raw
history blame
3.29 kB
import streamlit as st
from PIL import Image
import pytesseract
import pandas as pd
import re
def extract_text(image):
"""
Extract text from the image using Tesseract.
"""
return pytesseract.image_to_string(image)
def clean_and_parse_extracted_text(raw_text):
"""
Parse and clean the raw text to extract structured data.
"""
# Split the text into lines and clean up
lines = raw_text.split("\n")
lines = [line.strip() for line in lines if line.strip()]
# Identify and extract rows with valid components
data = []
for line in lines:
# Match rows containing numeric ranges and values
match = re.match(
r"^(.*?)(\d+(\.\d+)?)(\s*-?\s*\d+(\.\d+)?\s*-?\s*\d+(\.\d+)?)?\s*([a-zA-Z/%]+)?\s*(H|L|Normal)?$",
line,
)
if match:
component = match.group(1).strip()
value = float(match.group(2))
range_match = match.group(4)
if range_match:
ranges = re.findall(r"[\d.]+", range_match)
min_val = float(ranges[0]) if len(ranges) > 0 else None
max_val = float(ranges[1]) if len(ranges) > 1 else None
else:
min_val = None
max_val = None
unit = match.group(7)
flag = "Normal" # Default flag
# Determine the flag based on value and range
if min_val is not None and max_val is not None:
if value < min_val:
flag = "L"
elif value > max_val:
flag = "H"
# Only append the data if the flag is abnormal (L or H)
if flag != "Normal":
data.append([component, value, min_val, max_val, unit, flag])
# Create a DataFrame
df = pd.DataFrame(data, columns=["Component", "Your Value", "Min", "Max", "Units", "Flag"])
# Fix misspellings and inconsistencies (if any known issues exist)
correction_map = {
"emoglobin": "Hemoglobin",
"ematocrit": "Hematocrit",
"% Platelet Count": "Platelet Count",
"ymphocyte %": "Lymphocyte %",
"L Differential Type Automated": "Differential Type",
}
df["Component"] = df["Component"].replace(correction_map)
return df
def display_results(df):
"""
Display the flagged abnormalities in a table format.
"""
st.dataframe(df, use_container_width=True)
# Streamlit app
st.title("Blood Report Analyzer")
st.write("Upload an image of a blood test report to analyze.")
uploaded_file = st.file_uploader("Upload Image", type=["png", "jpg", "jpeg"])
if uploaded_file is not None:
try:
# Load the image
image = Image.open(uploaded_file)
# Display the uploaded image
st.image(image, caption="Uploaded Image", use_container_width=True)
# Extract text from the image
extracted_text = extract_text(image)
# Parse the extracted text into a structured format
parsed_data = clean_and_parse_extracted_text(extracted_text)
# Display the structured data (only abnormalities)
st.subheader("Flagged Abnormalities")
display_results(parsed_data)
except Exception as e:
st.error(f"An error occurred: {e}")