import streamlit as st import cv2 import numpy as np from PIL import Image # Título do aplicativo st.title("Analisador de Imagens Médicas com OpenCV") st.subheader("Carregue uma imagem médica para análise e melhoria.") # Carregar a imagem uploaded_file = st.file_uploader("Envie a imagem médica (formatos aceitos: .jpg, .png, .jpeg)", type=["jpg", "png", "jpeg"]) if uploaded_file is not None: # Carregar a imagem com OpenCV image = Image.open(uploaded_file) image = np.array(image) # Mostrar a imagem original st.image(image, caption="Imagem Original", use_column_width=True) # Opções de processamento st.sidebar.header("Opções de Processamento") process_option = st.sidebar.selectbox("Escolha o processamento:", ["Conversão para Escala de Cinza", "Filtro de Borrão (Blur)", "Detecção de Bordas (Canny)", "Equalização de Histograma", "Ajuste de Brilho e Contraste", "Detecção de Contornos"]) if process_option == "Conversão para Escala de Cinza": gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) st.image(gray_image, caption="Imagem em Escala de Cinza", use_column_width=True, channels="GRAY") elif process_option == "Filtro de Borrão (Blur)": ksize = st.sidebar.slider("Tamanho do kernel de desfoque:", min_value=3, max_value=15, step=2, value=5) blur_image = cv2.GaussianBlur(image, (ksize, ksize), 0) st.image(blur_image, caption="Imagem com Filtro de Borrão", use_column_width=True) elif process_option == "Detecção de Bordas (Canny)": gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) threshold1 = st.sidebar.slider("Threshold 1:", min_value=50, max_value=150, value=100) threshold2 = st.sidebar.slider("Threshold 2:", min_value=100, max_value=300, value=200) edges = cv2.Canny(gray_image, threshold1, threshold2) st.image(edges, caption="Bordas Detectadas", use_column_width=True, channels="GRAY") elif process_option == "Equalização de Histograma": gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) equalized_image = cv2.equalizeHist(gray_image) st.image(equalized_image, caption="Imagem com Histograma Equalizado", use_column_width=True, channels="GRAY") elif process_option == "Ajuste de Brilho e Contraste": brightness = st.sidebar.slider("Brilho:", min_value=-100, max_value=100, value=0) contrast = st.sidebar.slider("Contraste:", min_value=-100, max_value=100, value=0) adjusted_image = cv2.convertScaleAbs(image, alpha=1 + (contrast / 100), beta=brightness) st.image(adjusted_image, caption="Imagem com Ajuste de Brilho e Contraste", use_column_width=True) elif process_option == "Detecção de Contornos": gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) threshold = st.sidebar.slider("Threshold para Contornos:", min_value=50, max_value=255, value=127) _, thresh = cv2.threshold(gray_image, threshold, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contour_image = cv2.drawContours(image.copy(), contours, -1, (0, 255, 0), 2) st.image(contour_image, caption="Contornos Detectados", use_column_width=True) # Exibição do histograma st.sidebar.header("Exibir Histograma") if st.sidebar.checkbox("Mostrar histograma da imagem"): if len(image.shape) == 3: colors = ("b", "g", "r") for i, color in enumerate(colors): hist = cv2.calcHist([image], [i], None, [256], [0, 256]) st.line_chart(hist[:, 0]) else: hist = cv2.calcHist([image], [0], None, [256], [0, 256]) st.line_chart(hist[:, 0]) # Botão para salvar o resultado if st.button("Salvar Imagem Processada"): result_path = "imagem_processada.png" cv2.imwrite(result_path, locals()[process_option.lower().replace(" ", "_") + "_image"]) st.success(f"Imagem salva como {result_path}") else: st.info("Por favor, envie uma imagem médica para começar.")