DHEIVER's picture
Update app.py
ac42920 verified
import gradio as gr
import numpy as np
import cv2
from dataclasses import dataclass
from typing import Dict, List, Tuple, Optional
import json
@dataclass
class IrisCharacteristics:
color: str
density: str
structure: str
marks: List[str]
regions: Dict[str, List[str]]
class AdvancedIridologyAnalyzer:
def __init__(self):
# Classificação de cores da íris
self.iris_colors = {
'azul': {
'range': [(200, 220, 220), (240, 255, 255)],
'characteristics': ['Sistema linfático sensível', 'Tendência à acidez', 'Sensibilidade digestiva']
},
'castanho': {
'range': [(0, 60, 60), (20, 150, 150)],
'characteristics': ['Sistema imunológico robusto', 'Metabolismo mais ativo', 'Tendência à alcalinidade']
},
'verde': {
'range': [(35, 50, 50), (85, 255, 255)],
'characteristics': ['Misto de características', 'Adaptabilidade metabólica', 'Sensibilidade moderada']
},
'misto': {
'characteristics': ['Complexidade constitucional', 'Variabilidade metabólica', 'Adaptação mista']
}
}
# Mapa detalhado de órgãos e sistemas
self.detailed_iris_map = {
'zona_pupilar': {
'órgãos': ['Estômago', 'Intestino delgado'],
'significados': {
'escuro': 'Possível estagnação digestiva',
'claro': 'Hiperatividade digestiva',
'irregular': 'Disbiose potencial'
}
},
'zona_ciliar': {
'órgãos': ['Coração', 'Pulmões', 'Fígado', 'Rins'],
'significados': {
'manchas': 'Sobrecarga orgânica',
'lacunas': 'Deficiência funcional',
'anéis': 'Tensão crônica'
}
},
'zona_periférica': {
'órgãos': ['Pele', 'Sistema linfático', 'Circulação'],
'significados': {
'pigmentos': 'Deposição tóxica',
'raios': 'Eliminação prejudicada',
'nuvens': 'Congestão linfática'
}
}
}
# Constituições iridianas
self.constitutions = {
'linfática': {
'características': ['Íris azul clara', 'Fibras separadas', 'Aspecto rendilhado'],
'tendências': ['Alergias', 'Problemas respiratórios', 'Sensibilidade digestiva']
},
'hematogênica': {
'características': ['Íris castanha', 'Fibras densas', 'Aspecto compacto'],
'tendências': ['Inflamações', 'Problemas circulatórios', 'Metabolismo acelerado']
},
'mista': {
'características': ['Íris heterocromática', 'Padrões mistos', 'Variações estruturais'],
'tendências': ['Adaptabilidade', 'Reações mistas', 'Variabilidade sintomática']
}
}
def detect_iris_color(self, image: np.ndarray) -> str:
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mean_color = np.mean(hsv, axis=(0, 1))
# Lógica melhorada para detecção de cor
if mean_color[0] < 20: # Matiz
return 'castanho'
elif 20 <= mean_color[0] < 85:
return 'verde'
elif mean_color[0] >= 85:
return 'azul'
return 'misto'
def analyze_density(self, gray_region: np.ndarray) -> str:
std_dev = np.std(gray_region)
if std_dev < 15:
return 'muito_densa'
elif std_dev < 30:
return 'densa'
elif std_dev < 45:
return 'normal'
else:
return 'esparsa'
def detect_marks(self, region: np.ndarray) -> List[str]:
marks = []
gray = cv2.cvtColor(region, cv2.COLOR_BGR2GRAY)
# Detecção de lacunas
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 5:
marks.append('lacunas')
# Detecção de anéis de tensão
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,
param1=50, param2=30, minRadius=5, maxRadius=30)
if circles is not None:
marks.append('anéis_de_tensão')
# Detecção de radii solaris
edges = cv2.Canny(gray, 50, 150)
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
if lines is not None and len(lines) > 10:
marks.append('radii_solaris')
return marks
def analyze_specific_regions(self, image: np.ndarray, iris_center: Tuple[int, int],
iris_radius: int) -> Dict[str, List[str]]:
regions_analysis = {}
angles = {
'cerebral': (75, 105),
'digestivo': (255, 285),
'circulatório': (165, 195),
'respiratório': (345, 15)
}
for region_name, (start_angle, end_angle) in angles.items():
mask = np.zeros(image.shape[:2], dtype=np.uint8)
cv2.ellipse(mask, center=iris_center, axes=(iris_radius, iris_radius),
angle=0, startAngle=start_angle, endAngle=end_angle,
color=255, thickness=-1)
region = cv2.bitwise_and(image, image, mask=mask)
findings = []
# Análise específica por região
if region_name == 'cerebral':
if np.mean(region) > 150:
findings.append('Alta atividade cerebral')
elif np.mean(region) < 100:
findings.append('Possível fadiga mental')
elif region_name == 'digestivo':
std_dev = np.std(region)
if std_dev > 40:
findings.append('Irregularidade digestiva')
if np.mean(region) < 100:
findings.append('Possível estagnação')
elif region_name == 'circulatório':
if np.mean(region) > 160:
findings.append('Hiperatividade circulatória')
edges = cv2.Canny(region, 100, 200)
if np.sum(edges) > 1000:
findings.append('Tensão vascular')
elif region_name == 'respiratório':
if np.mean(region) < 90:
findings.append('Congestão respiratória')
if np.std(region) > 45:
findings.append('Sensibilidade pulmonar')
regions_analysis[region_name] = findings
return regions_analysis
def generate_recommendations(self, characteristics: IrisCharacteristics) -> List[str]:
recommendations = []
# Recomendações baseadas na cor
if characteristics.color == 'azul':
recommendations.extend([
'Fortalecer sistema imunológico',
'Equilibrar pH corporal',
'Cuidados com sistema linfático'
])
elif characteristics.color == 'castanho':
recommendations.extend([
'Monitorar níveis inflamatórios',
'Atenção à circulação',
'Suporte hepático preventivo'
])
# Recomendações baseadas na densidade
if characteristics.density == 'esparsa':
recommendations.extend([
'Suplementação mineral',
'Fortalecimento tecidual',
'Avaliação nutricional completa'
])
# Recomendações baseadas em marcas específicas
if 'lacunas' in characteristics.marks:
recommendations.extend([
'Terapia regenerativa tecidual',
'Suporte orgânico específico'
])
if 'anéis_de_tensão' in characteristics.marks:
recommendations.extend([
'Técnicas de gerenciamento de estresse',
'Terapias de relaxamento'
])
return recommendations
def analyze_iris(self, image) -> str:
if image is None:
return "Erro: Imagem não fornecida."
if len(image.shape) == 2:
image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
circles = cv2.HoughCircles(
blurred,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=50,
param1=50,
param2=30,
minRadius=20,
maxRadius=100
)
if circles is None:
return "Não foi possível detectar a íris na imagem. Tente uma imagem mais clara ou de melhor qualidade."
x, y, r = np.round(circles[0][0]).astype(int)
iris_color = self.detect_iris_color(image)
density = self.analyze_density(gray)
marks = self.detect_marks(image)
regions = self.analyze_specific_regions(image, (x, y), r)
characteristics = IrisCharacteristics(
color=iris_color,
density=density,
structure='regular' if np.std(gray) < 40 else 'irregular',
marks=marks,
regions=regions
)
recommendations = self.generate_recommendations(characteristics)
# Formatted result
result = [
"=== ANÁLISE IRIDIOLÓGICA COMPLETA ===\n",
f"Cor da Íris: {iris_color.upper()}",
f"Densidade: {density.upper()}",
f"Estrutura: {characteristics.structure.upper()}\n",
"=== MARCAS DETECTADAS ==="
]
# Append marks or a message if none are detected
if marks:
result.extend([f"- {mark}" for mark in marks])
else:
result.append("Nenhuma marca detectada.")
result.append("\n=== ANÁLISE POR REGIÃO ===")
for region, findings in regions.items():
if findings:
result.append(f"\n{region.upper()}:")
result.extend([f"- {finding}" for finding in findings])
result.extend([
"\n=== RECOMENDAÇÕES ===",
*[f"- {rec}" for rec in recommendations],
"\nOBSERVAÇÃO: Esta análise é apenas para fins educativos e não substitui diagnóstico médico profissional."
])
return "\n".join(result)
# Interface Gradio
iface = gr.Interface(
fn=lambda img: AdvancedIridologyAnalyzer().analyze_iris(img),
inputs=gr.Image(),
outputs=gr.Textbox(label="Resultado da Análise", lines=25),
title="Análise Iridiológica Avançada",
description="Faça upload de uma imagem clara do olho para análise iridiológica detalhada",
theme="default"
)
if __name__ == "__main__":
iface.launch()