|
import streamlit as st |
|
import cv2 |
|
import numpy as np |
|
from PIL import Image |
|
|
|
|
|
st.title("Analisador de Imagens Médicas com OpenCV") |
|
st.subheader("Carregue uma imagem médica para análise e melhoria.") |
|
|
|
|
|
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: |
|
|
|
image = Image.open(uploaded_file) |
|
image = np.array(image) |
|
|
|
|
|
st.image(image, caption="Imagem Original", use_column_width=True) |
|
|
|
|
|
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) |
|
|
|
|
|
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]) |
|
|
|
|
|
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.") |
|
|