|
import streamlit as st |
|
import cv2 |
|
import numpy as np |
|
from PIL import Image |
|
|
|
|
|
def preprocess_image(image): |
|
|
|
image_np = np.array(image) |
|
|
|
|
|
image_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) |
|
|
|
|
|
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) |
|
image_clahe = clahe.apply(image_gray) |
|
|
|
|
|
sobel_x = cv2.Sobel(image_clahe, cv2.CV_64F, 1, 0) |
|
sobel_y = cv2.Sobel(image_clahe, cv2.CV_64F, 0, 1) |
|
|
|
|
|
sobel_magnitude = cv2.magnitude(sobel_x, sobel_y) |
|
|
|
|
|
_, binary_image = cv2.threshold(sobel_magnitude, 70, 100, cv2.THRESH_BINARY) |
|
|
|
|
|
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) |
|
dilated_image = cv2.dilate(binary_image, kernel, iterations=1) |
|
final_image = cv2.erode(dilated_image, kernel, iterations=1) |
|
|
|
|
|
final_image_normalized = cv2.normalize(final_image, None, 0, 1, cv2.NORM_MINMAX) |
|
|
|
return final_image_normalized |
|
|
|
|
|
st.title('Image Processing and Display') |
|
|
|
|
|
uploaded_files = st.file_uploader("Choose images", type=['png', 'jpg', 'jpeg'], accept_multiple_files=True) |
|
|
|
|
|
if st.button('Process Images'): |
|
if uploaded_files: |
|
st.write(f"Total files uploaded: {len(uploaded_files)}") |
|
|
|
for uploaded_file in uploaded_files: |
|
|
|
image = Image.open(uploaded_file) |
|
|
|
|
|
preprocessed_image = preprocess_image(image) |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
st.subheader(f"Original Image: {uploaded_file.name}") |
|
st.image(image, caption='Original Image', use_column_width=True) |
|
|
|
with col2: |
|
st.subheader("Processed image") |
|
st.image(preprocessed_image, caption='Image with Blood vessels extracted', use_column_width=True, clamp=True) |
|
else: |
|
st.warning("Please upload images before processing.") |