|
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): |
|
|
|
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'] |
|
} |
|
} |
|
|
|
|
|
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' |
|
} |
|
} |
|
} |
|
|
|
|
|
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)) |
|
|
|
|
|
if mean_color[0] < 20: |
|
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) |
|
|
|
|
|
_, 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') |
|
|
|
|
|
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') |
|
|
|
|
|
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 = [] |
|
|
|
|
|
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 = [] |
|
|
|
|
|
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' |
|
]) |
|
|
|
|
|
if characteristics.density == 'esparsa': |
|
recommendations.extend([ |
|
'Suplementação mineral', |
|
'Fortalecimento tecidual', |
|
'Avaliação nutricional completa' |
|
]) |
|
|
|
|
|
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) |
|
|
|
|
|
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 ===" |
|
] |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
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() |