Spaces:
Sleeping
Sleeping
import gradio as gr | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import io | |
# Dicionário de áreas da íris e suas correlações com órgãos/sistemas | |
MAPA_IRIDOLOGICO = { | |
"superior": { | |
"cerebro": (330, 30), | |
"sistema_nervoso": (0, 30), | |
}, | |
"superior_direito": { | |
"pulmao": (30, 60), | |
"bronquios": (45, 60), | |
}, | |
"direito": { | |
"figado": (60, 120), | |
"vesicula": (75, 120), | |
"rim_direito": (90, 120), | |
}, | |
"inferior_direito": { | |
"intestino_grosso": (120, 150), | |
"apendice": (135, 150), | |
}, | |
"inferior": { | |
"sistema_digestivo": (150, 210), | |
"intestino_delgado": (180, 210), | |
}, | |
"inferior_esquerdo": { | |
"bexiga": (210, 240), | |
"sistema_reprodutor": (225, 240), | |
}, | |
"esquerdo": { | |
"estomago": (240, 300), | |
"pancreas": (255, 300), | |
"rim_esquerdo": (270, 300), | |
}, | |
"superior_esquerdo": { | |
"coracao": (300, 330), | |
"tireoide": (315, 330), | |
} | |
} | |
def analisar_caracteristicas_iris(roi, setor): | |
""" | |
Analisa características específicas de um setor da íris | |
""" | |
if roi.size == 0: | |
return [] | |
media = np.mean(roi) | |
std = np.std(roi) | |
# Análise de padrões específicos | |
alteracoes = [] | |
# Análise de densidade | |
if media < 85: # Área escura | |
alteracoes.append("Possível congestão/inflamação") | |
elif media > 170: # Área clara | |
alteracoes.append("Possível deficiência/hipofunção") | |
# Análise de textura | |
if std > 45: # Alta variação | |
alteracoes.append("Sinais de irritação/estresse") | |
elif std < 15: # Baixa variação | |
alteracoes.append("Possível atrofia/degeneração") | |
return alteracoes | |
def analisar_iris(imagem): | |
""" | |
Realiza análise completa da íris com foco em indicadores de saúde | |
""" | |
# Converter para array numpy | |
img_array = np.array(imagem) | |
# Converter para escala de cinza | |
gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY) | |
# Detectar círculos (íris) | |
circles = cv2.HoughCircles( | |
gray, | |
cv2.HOUGH_GRADIENT, | |
dp=1, | |
minDist=50, | |
param1=50, | |
param2=30, | |
minRadius=20, | |
maxRadius=100 | |
) | |
output = img_array.copy() | |
analise_detalhada = [] | |
if circles is not None: | |
circles = np.uint16(np.around(circles)) | |
for i in circles[0, :]: | |
center = (i[0], i[1]) | |
radius = i[2] | |
# Desenhar círculo da íris | |
cv2.circle(output, center, radius, (0, 255, 0), 2) | |
# Análise por setores | |
for setor, orgaos in MAPA_IRIDOLOGICO.items(): | |
for orgao, (ang_inicio, ang_fim) in orgaos.items(): | |
# Criar máscara para o setor | |
mask = np.zeros_like(gray) | |
cv2.ellipse(mask, center, (radius, radius), 0, ang_inicio, ang_fim, 255, -1) | |
# Região de interesse | |
roi = cv2.bitwise_and(gray, gray, mask=mask) | |
# Analisar características | |
alteracoes = analisar_caracteristicas_iris(roi[roi != 0], setor) | |
if alteracoes: | |
# Desenhar indicador no setor | |
ang_medio = np.radians((ang_inicio + ang_fim) / 2) | |
pt_x = int(center[0] + (radius * 0.8) * np.cos(ang_medio)) | |
pt_y = int(center[1] + (radius * 0.8) * np.sin(ang_medio)) | |
cv2.circle(output, (pt_x, pt_y), 3, (0, 0, 255), -1) | |
# Adicionar à análise | |
orgao_formatado = orgao.replace("_", " ").title() | |
analise_detalhada.append(f"\nRegião: {orgao_formatado}") | |
for alt in alteracoes: | |
analise_detalhada.append(f"- {alt}") | |
return output, "\n".join(analise_detalhada) | |
def gerar_relatorio_saude(imagem, nome_paciente, idade, data_analise, sintomas): | |
""" | |
Gera relatório completo com análise de saúde | |
""" | |
resultado_imagem, analise = analisar_iris(imagem) | |
relatorio = f""" | |
RELATÓRIO DE ANÁLISE IRIDOLÓGICA - AVALIAÇÃO DE SAÚDE | |
Data: {data_analise} | |
DADOS DO PACIENTE | |
Nome: {nome_paciente} | |
Idade: {idade} | |
SINTOMAS RELATADOS | |
{sintomas} | |
ANÁLISE IRIDOLÓGICA DETALHADA | |
{analise} | |
OBSERVAÇÕES IMPORTANTES | |
- Esta análise é baseada em princípios da iridologia | |
- Os resultados são indicativos e não substituem diagnóstico médico | |
- Recomenda-se consulta com profissionais de saúde para avaliação completa | |
- Alterações identificadas podem ter diferentes significados clínicos | |
""" | |
return resultado_imagem, relatorio | |
def main(): | |
# Configuração do tema moderno | |
theme = gr.themes.Soft( | |
primary_hue="teal", | |
secondary_hue="indigo", | |
).set( | |
body_background_fill="*neutral_50", | |
block_background_fill="*neutral_100", | |
button_primary_background_fill="*primary_500", | |
button_primary_background_fill_dark="*primary_600", | |
) | |
# Interface principal | |
with gr.Blocks(theme=theme, title="Análise Iridológica - Avaliação de Saúde") as iface: | |
gr.Markdown(""" | |
# Sistema Avançado de Análise Iridológica | |
### Avaliação de Indicadores de Saúde através da Íris | |
""") | |
with gr.Tabs(): | |
# Aba de Análise Rápida | |
with gr.Tab("Análise Rápida"): | |
with gr.Row(): | |
with gr.Column(): | |
input_image = gr.Image(label="Upload da Imagem da Íris", type="pil") | |
analyze_btn = gr.Button("Analisar Íris", variant="primary") | |
with gr.Column(): | |
output_image = gr.Image(label="Íris Analisada") | |
output_text = gr.Textbox(label="Indicadores Identificados", lines=10) | |
analyze_btn.click( | |
fn=analisar_iris, | |
inputs=[input_image], | |
outputs=[output_image, output_text] | |
) | |
# Aba de Relatório Detalhado | |
with gr.Tab("Relatório Detalhado"): | |
with gr.Row(): | |
with gr.Column(): | |
nome_input = gr.Textbox(label="Nome do Paciente") | |
idade_input = gr.Number(label="Idade", minimum=0, maximum=120) | |
data_input = gr.Textbox(label="Data da Análise") | |
sintomas_input = gr.Textbox(label="Sintomas Relatados", lines=3) | |
report_image = gr.Image(label="Imagem da Íris", type="pil") | |
report_btn = gr.Button("Gerar Relatório Completo", variant="primary") | |
with gr.Column(): | |
report_output_image = gr.Image(label="Íris Analisada") | |
report_output = gr.Textbox(label="Relatório de Saúde", lines=15) | |
report_btn.click( | |
fn=gerar_relatorio_saude, | |
inputs=[report_image, nome_input, idade_input, data_input, sintomas_input], | |
outputs=[report_output_image, report_output] | |
) | |
# Aba de Referência | |
with gr.Tab("Guia de Referência"): | |
gr.Markdown(""" | |
## Guia de Interpretação Iridológica | |
### Significados das Análises | |
- Áreas Escuras: Podem indicar congestão ou inflamação | |
- Áreas Claras: Podem indicar deficiência ou hipofunção | |
- Texturas Irregulares: Podem indicar irritação ou estresse | |
- Marcas Radiais: Podem indicar tensão ou sobrecarga | |
### Regiões da Íris e Correlações | |
1. Região Superior | |
- Cérebro e Sistema Nervoso | |
2. Região Direita | |
- Fígado | |
- Vesícula Biliar | |
- Rim Direito | |
3. Região Inferior | |
- Sistema Digestivo | |
- Intestinos | |
4. Região Esquerda | |
- Coração | |
- Estômago | |
- Rim Esquerdo | |
### Observações Importantes | |
- A análise iridológica é uma ferramenta complementar | |
- Não substitui diagnósticos médicos convencionais | |
- Deve ser usada em conjunto com outros métodos de avaliação | |
- Consulte sempre profissionais de saúde qualificados | |
""") | |
# Iniciar a interface | |
iface.launch(share=True) | |
if __name__ == "__main__": | |
main() |