Spaces:
Sleeping
Sleeping
import gradio as gr | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import io | |
from collections import defaultdict | |
def detectar_iris(imagem): | |
""" | |
Detecta a íris na imagem e retorna a região de interesse | |
""" | |
# Converter para escala de cinza | |
gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY) | |
# Aplicar blur para reduzir ruído | |
blur = cv2.GaussianBlur(gray, (7, 7), 0) | |
# Detectar círculos (íris) usando transformada de Hough | |
circles = cv2.HoughCircles( | |
blur, | |
cv2.HOUGH_GRADIENT, | |
dp=1, | |
minDist=50, | |
param1=50, | |
param2=30, | |
minRadius=50, | |
maxRadius=150 | |
) | |
if circles is not None: | |
# Converter coordenadas para inteiros | |
circles = np.uint16(np.around(circles)) | |
# Pegar o primeiro círculo detectado | |
x, y, r = circles[0][0] | |
# Criar máscara circular | |
mask = np.zeros_like(gray) | |
cv2.circle(mask, (x, y), r, 255, -1) | |
# Aplicar máscara na imagem original | |
result = cv2.bitwise_and(imagem, imagem, mask=mask) | |
# Recortar região da íris | |
roi = result[y-r:y+r, x-r:x+r] | |
return roi, (x, y, r) | |
return None, None | |
def analisar_textura(roi): | |
""" | |
Analisa a textura da íris para identificar padrões | |
""" | |
if roi is None: | |
return {} | |
# Converter para escala de cinza | |
gray = cv2.cvtColor(roi, cv2.COLOR_RGB2GRAY) | |
# Análises de textura | |
padroes = { | |
"congestao_inflamacao": False, | |
"deficiencia_hipofuncao": False, | |
"atrofia_degeneracao": False, | |
"irritacao_estresse": False | |
} | |
# Análise de variância local | |
kernel_size = 5 | |
local_var = cv2.Laplacian(gray, cv2.CV_64F).var() | |
# Análise de intensidade média | |
mean_intensity = np.mean(gray) | |
# Análise de contraste | |
contrast = np.std(gray) | |
# Detecção de bordas | |
edges = cv2.Canny(gray, 100, 200) | |
edge_density = np.sum(edges) / (edges.shape[0] * edges.shape[1]) | |
# Definir limiares para cada padrão | |
if local_var > 100: | |
padroes["congestao_inflamacao"] = True | |
if mean_intensity < 100: | |
padroes["deficiencia_hipofuncao"] = True | |
if contrast < 30: | |
padroes["atrofia_degeneracao"] = True | |
if edge_density > 0.1: | |
padroes["irritacao_estresse"] = True | |
return padroes | |
def analisar_setores(roi, centro, raio): | |
""" | |
Analisa diferentes setores da íris | |
""" | |
if roi is None: | |
return {} | |
setores = { | |
"superior": (315, 45), # Cérebro | |
"direito": (45, 135), # Fígado | |
"inferior": (135, 225), # Sistema Digestivo | |
"esquerdo": (225, 315) # Coração | |
} | |
resultados = {} | |
for setor, (ang_inicio, ang_fim) in setores.items(): | |
# Criar máscara para o setor | |
mask = np.zeros_like(roi[:,:,0]) | |
cv2.ellipse(mask, | |
(raio, raio), | |
(raio-10, raio-10), | |
0, | |
ang_inicio, | |
ang_fim, | |
255, | |
-1) | |
# Aplicar máscara | |
setor_roi = cv2.bitwise_and(roi, roi, mask=mask) | |
# Analisar textura do setor | |
resultados[setor] = analisar_textura(setor_roi) | |
return resultados | |
def gerar_diagnostico(padroes, setores): | |
""" | |
Gera diagnóstico baseado nos padrões encontrados | |
""" | |
diagnostico = [] | |
# Mapeamento de padrões para possíveis condições | |
mapa_condicoes = { | |
"congestao_inflamacao": [ | |
"Processo inflamatório ativo", | |
"Possível condição autoimune", | |
"Inflamação crônica" | |
], | |
"deficiencia_hipofuncao": [ | |
"Deficiência nutricional", | |
"Hipofunção glandular", | |
"Fadiga crônica" | |
], | |
"atrofia_degeneracao": [ | |
"Desgaste tecidual", | |
"Processo degenerativo", | |
"Envelhecimento acelerado" | |
], | |
"irritacao_estresse": [ | |
"Estresse crônico", | |
"Sobrecarga do sistema nervoso", | |
"Ansiedade" | |
] | |
} | |
# Analisar padrões gerais | |
for padrao, presente in padroes.items(): | |
if presente: | |
diagnostico.extend(mapa_condicoes[padrao]) | |
# Analisar setores específicos | |
for setor, padroes_setor in setores.items(): | |
for padrao, presente in padroes_setor.items(): | |
if presente: | |
if setor == "superior": | |
diagnostico.append(f"Região cerebral: {mapa_condicoes[padrao][0]}") | |
elif setor == "direito": | |
diagnostico.append(f"Região hepática: {mapa_condicoes[padrao][0]}") | |
elif setor == "inferior": | |
diagnostico.append(f"Região digestiva: {mapa_condicoes[padrao][0]}") | |
elif setor == "esquerdo": | |
diagnostico.append(f"Região cardíaca: {mapa_condicoes[padrao][0]}") | |
return list(set(diagnostico)) # Remover duplicatas | |
def processar_imagem(imagem): | |
""" | |
Processa a imagem da íris e retorna análise | |
""" | |
# Converter imagem para formato OpenCV | |
img_array = np.array(imagem) | |
# Detectar íris | |
roi, (x, y, r) = detectar_iris(img_array) | |
if roi is None: | |
return "Não foi possível detectar a íris na imagem." | |
# Analisar padrões gerais | |
padroes = analisar_textura(roi) | |
# Analisar setores | |
setores = analisar_setores(roi, (x, y), r) | |
# Gerar diagnóstico | |
diagnostico = gerar_diagnostico(padroes, setores) | |
# Gerar visualização | |
output_img = img_array.copy() | |
cv2.circle(output_img, (x, y), r, (0, 255, 0), 2) | |
# Desenhar setores | |
ang_step = 45 | |
for ang in range(0, 360, ang_step): | |
end_x = int(x + r * np.cos(np.radians(ang))) | |
end_y = int(y + r * np.sin(np.radians(ang))) | |
cv2.line(output_img, (x, y), (end_x, end_y), (0, 255, 0), 1) | |
return output_img, "\n".join(diagnostico) | |
def criar_interface(): | |
""" | |
Cria interface moderna do Gradio | |
""" | |
# Tema personalizado verde piscina | |
theme = gr.themes.Soft( | |
primary_hue="teal", | |
secondary_hue="green", | |
).set( | |
body_text_color="#2A9D8F", | |
block_title_text_color="#264653", | |
block_label_text_color="#2A9D8F", | |
input_background_fill="#E9F5F3", | |
button_primary_background_fill="#2A9D8F", | |
button_primary_background_fill_dark="#264653", | |
) | |
# Interface | |
with gr.Blocks(theme=theme, title="Análise Iridológica por Imagem") as interface: | |
gr.Markdown(""" | |
# Sistema Avançado de Análise Iridológica | |
### Análise automatizada de imagens da íris | |
""") | |
with gr.Tabs(): | |
# Aba de Análise | |
with gr.Tab("Análise de Imagem"): | |
with gr.Row(): | |
with gr.Column(): | |
input_image = gr.Image( | |
label="Imagem da Íris", | |
type="pil" | |
) | |
with gr.Column(): | |
output_image = gr.Image( | |
label="Íris Analisada" | |
) | |
analysis_btn = gr.Button("Analisar Íris", variant="primary") | |
output_text = gr.Textbox( | |
label="Diagnóstico", | |
lines=10 | |
) | |
analysis_btn.click( | |
fn=processar_imagem, | |
inputs=[input_image], | |
outputs=[output_image, output_text] | |
) | |
# Aba de Guia | |
with gr.Tab("Guia de Interpretação"): | |
gr.Markdown(""" | |
## Interpretação dos Sinais | |
### Padrões Principais | |
- **Congestão/Inflamação**: Áreas escuras ou densas | |
- **Deficiência/Hipofunção**: Áreas claras ou vazias | |
- **Atrofia/Degeneração**: Lacunas ou descontinuidades | |
- **Irritação/Estresse**: Linhas radiais ou manchas | |
### Setores da Íris | |
1. **Superior**: Região cerebral | |
2. **Direito**: Região hepática | |
3. **Inferior**: Região digestiva | |
4. **Esquerdo**: Região cardíaca | |
### Recomendações | |
- Faça a foto com boa iluminação | |
- Mantenha o olho bem aberto | |
- Evite reflexos na imagem | |
- Use câmera com boa resolução | |
""") | |
# Aba de Recomendações | |
with gr.Tab("Recomendações"): | |
gr.Markdown(""" | |
## Recomendações Gerais | |
### Qualidade da Imagem | |
- Resolução mínima: 1280x720 | |
- Iluminação uniforme | |
- Foco na íris | |
- Sem reflexos | |
### Preparação | |
1. **Ambiente** | |
- Bem iluminado | |
- Sem luz direta | |
- Fundo claro | |
2. **Posicionamento** | |
- Olho bem aberto | |
- Câmera estável | |
- Distância adequada | |
3. **Momento** | |
- Evite olhos irritados | |
- Preferencialmente pela manhã | |
- Após descanso | |
""") | |
return interface | |
if __name__ == "__main__": | |
interface = criar_interface() | |
interface.launch(share=True) |