DHEIVER commited on
Commit
564252c
·
verified ·
1 Parent(s): de232cf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +262 -246
app.py CHANGED
@@ -5,200 +5,220 @@ from PIL import Image
5
  import io
6
  from collections import defaultdict
7
 
8
- # Mapeamento detalhado de sinais para doenças específicas
9
- SINAIS_DOENÇAS = {
10
- "congestao_inflamacao": {
11
- "Doenças Autoimunes": {
12
- "Artrite Reumatoide": {
13
- "prob": 0.75,
14
- "sinais_adicionais": ["simetria", "anéis de tensão"],
15
- "exames": ["Fator Reumatóide", "Anti-CCP", "PCR", "VHS"],
16
- "tratamentos": ["Imunossupressores", "Anti-inflamatórios", "Fisioterapia"]
17
- },
18
- "Lúpus": {
19
- "prob": 0.70,
20
- "sinais_adicionais": ["manchas em borboleta", "lacunas"],
21
- "exames": ["FAN", "Anti-DNA", "Complemento"],
22
- "tratamentos": ["Corticoides", "Antimaláricos", "Protetor Solar"]
23
- }
24
- },
25
- "Doenças Inflamatórias": {
26
- "Doença de Crohn": {
27
- "prob": 0.65,
28
- "sinais_adicionais": ["radiais intestinais", "hiperpigmentação"],
29
- "exames": ["Calprotectina", "Colonoscopia", "PCR"],
30
- "tratamentos": ["Imunomoduladores", "Biológicos", "Dieta"]
31
- }
32
- }
33
- },
34
- "deficiencia_hipofuncao": {
35
- "Doenças Endócrinas": {
36
- "Hipotireoidismo": {
37
- "prob": 0.80,
38
- "sinais_adicionais": ["anéis nervosos", "pigmentação clara"],
39
- "exames": ["TSH", "T4 livre", "Anti-TPO"],
40
- "tratamentos": ["Levotiroxina", "Suplementação de Iodo", "Selenium"]
41
- },
42
- "Diabetes": {
43
- "prob": 0.75,
44
- "sinais_adicionais": ["radiais pancreáticos", "manchas açúcar"],
45
- "exames": ["Glicemia", "HbA1c", "Peptídeo C"],
46
- "tratamentos": ["Insulina", "Metformina", "Dieta"]
47
- }
48
- }
49
- },
50
- "atrofia_degeneracao": {
51
- "Doenças Neurológicas": {
52
- "Alzheimer": {
53
- "prob": 0.70,
54
- "sinais_adicionais": ["lesões cerebrais", "manchas escuras"],
55
- "exames": ["Mini-Mental", "Ressonância", "Beta Amilóide"],
56
- "tratamentos": ["Inibidores Colinesterase", "Memantina", "Estimulação"]
57
- }
58
- },
59
- "Doenças Ósseas": {
60
- "Osteoporose": {
61
- "prob": 0.75,
62
- "sinais_adicionais": ["anéis cálcio", "lacunas ósseas"],
63
- "exames": ["Densitometria", "Vitamina D", "CTX"],
64
- "tratamentos": ["Bisfosfonatos", "Cálcio", "Exercícios"]
65
- }
66
- }
67
- },
68
- "irritacao_estresse": {
69
- "Doenças Psiquiátricas": {
70
- "Ansiedade Generalizada": {
71
- "prob": 0.85,
72
- "sinais_adicionais": ["anéis nervosos", "manchas adrenal"],
73
- "exames": ["Cortisol", "ACTH", "Neurotransmissores"],
74
- "tratamentos": ["Ansiolíticos", "Psicoterapia", "Meditação"]
75
- },
76
- "Depressão": {
77
- "prob": 0.80,
78
- "sinais_adicionais": ["manchas escuras", "anéis profundos"],
79
- "exames": ["Serotonina", "Cortisol", "BDNF"],
80
- "tratamentos": ["Antidepressivos", "Psicoterapia", "Exercícios"]
81
- }
82
- }
83
  }
84
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
- # Correlações entre regiões da íris e sistemas corporais
87
- CORRELAÇÕES_SISTEMAS = {
88
- "Cerebro": {
89
- "sistema": "Sistema Nervoso Central",
90
- "doenças_associadas": [
91
- "Enxaqueca", "Epilepsia", "Parkinson",
92
- "Esclerose Múltipla", "Alzheimer"
93
- ]
94
- },
95
- "Sistema Nervoso": {
96
- "sistema": "Sistema Nervoso Periférico",
97
- "doenças_associadas": [
98
- "Neuropatia Diabética", "Síndrome do Túnel do Carpo",
99
- "Neuralgia do Trigêmeo"
100
- ]
101
- },
102
- "Pulmao": {
103
- "sistema": "Sistema Respiratório",
104
- "doenças_associadas": [
105
- "Asma", "DPOC", "Bronquite Crônica",
106
- "Fibrose Pulmonar", "Enfisema"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  ]
108
  }
109
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
- def analisar_doencas(dados_analise):
112
  """
113
- Analisa os dados para identificar possíveis doenças
114
  """
115
- resultados = defaultdict(list)
116
- padroes = defaultdict(int)
117
-
118
- # Análise por região
119
- regiao_atual = None
120
- sinais_atuais = set()
121
-
122
- for linha in dados_analise.split('\n'):
123
- if 'Região:' in linha:
124
- if regiao_atual and sinais_atuais:
125
- # Processar região anterior
126
- for sinal in sinais_atuais:
127
- if sinal in SINAIS_DOENÇAS:
128
- for categoria, doenças in SINAIS_DOENÇAS[sinal].items():
129
- for doença, info in doenças.items():
130
- resultados[regiao_atual].append({
131
- 'doença': doença,
132
- 'categoria': categoria,
133
- 'probabilidade': info['prob'],
134
- 'exames': info['exames'],
135
- 'tratamentos': info['tratamentos']
136
- })
137
-
138
- regiao_atual = linha.split('Região:')[1].strip()
139
- sinais_atuais = set()
140
-
141
- if regiao_atual:
142
- if 'congestão/inflamação' in linha:
143
- sinais_atuais.add('congestao_inflamacao')
144
- if 'deficiência/hipofunção' in linha:
145
- sinais_atuais.add('deficiencia_hipofuncao')
146
- if 'atrofia/degeneração' in linha:
147
- sinais_atuais.add('atrofia_degeneracao')
148
- if 'irritação/estresse' in linha:
149
- sinais_atuais.add('irritacao_estresse')
150
-
151
- return dict(resultados)
152
 
153
  def criar_interface():
154
  """
155
- Cria a interface moderna do Gradio com tema verde piscina
156
  """
157
- def analisar(texto_analise):
158
- resultados = analisar_doencas(texto_analise)
159
-
160
- # Gerar relatório estruturado
161
- saida = "ANÁLISE DETALHADA DE DOENÇAS POR IRIDOLOGIA\n\n"
162
-
163
- # Agrupar por sistemas
164
- sistemas = {
165
- "Sistema Nervoso": ["Cerebro", "Sistema Nervoso"],
166
- "Sistema Digestivo": ["Estomago", "Figado", "Vesicula", "Pancreas",
167
- "Sistema Digestivo", "Intestino Grosso", "Intestino Delgado"],
168
- "Sistema Circulatório": ["Coracao"],
169
- "Sistema Respiratório": ["Pulmao", "Bronquios"],
170
- "Sistema Endócrino": ["Tireoide"],
171
- "Sistema Urinário": ["Rim Direito", "Rim Esquerdo", "Bexiga"]
172
- }
173
-
174
- for sistema, orgaos in sistemas.items():
175
- saida += f"\n{sistema.upper()}\n{'='*len(sistema)}\n"
176
-
177
- doenças_sistema = []
178
- for orgao in orgaos:
179
- if orgao in resultados:
180
- for resultado in resultados[orgao]:
181
- doenças_sistema.append({
182
- 'orgao': orgao,
183
- **resultado
184
- })
185
-
186
- if doenças_sistema:
187
- # Ordenar por probabilidade
188
- doenças_sistema.sort(key=lambda x: x['probabilidade'], reverse=True)
189
-
190
- for doença in doenças_sistema:
191
- prob_percent = doença['probabilidade'] * 100
192
- saida += f"\n• {doença['doença']} ({doença['categoria']})\n"
193
- saida += f" Órgão: {doença['orgao']}\n"
194
- saida += f" Probabilidade: {prob_percent:.1f}%\n"
195
- saida += f" Exames Recomendados: {', '.join(doença['exames'])}\n"
196
- saida += f" Tratamentos Sugeridos: {', '.join(doença['tratamentos'])}\n"
197
- else:
198
- saida += " Sem alterações significativas\n"
199
-
200
- return saida
201
-
202
  # Tema personalizado verde piscina
203
  theme = gr.themes.Soft(
204
  primary_hue="teal",
@@ -210,68 +230,63 @@ def criar_interface():
210
  input_background_fill="#E9F5F3",
211
  button_primary_background_fill="#2A9D8F",
212
  button_primary_background_fill_dark="#264653",
213
- button_primary_text_color="#FFFFFF",
214
- button_primary_text_color_dark="#FFFFFF",
215
  )
216
-
217
- # Interface com abas
218
- with gr.Blocks(theme=theme, title="Análise Avançada de Doenças por Iridologia") as interface:
219
  gr.Markdown("""
220
- # Sistema Avançado de Análise de Doenças por Iridologia
221
- ### Análise detalhada com probabilidades e recomendações específicas
222
  """)
223
 
224
  with gr.Tabs():
225
- # Aba de Análise Principal
226
- with gr.Tab("Análise de Doenças"):
227
- input_text = gr.Textbox(
228
- label="Dados da Análise Iridológica",
229
- lines=10,
230
- placeholder="Cole os dados da análise aqui..."
231
- )
232
- analysis_btn = gr.Button("Analisar Doenças", variant="primary")
 
 
 
 
 
 
233
  output_text = gr.Textbox(
234
- label="Relatório de Doenças",
235
- lines=30
236
  )
237
 
238
  analysis_btn.click(
239
- fn=analisar,
240
- inputs=[input_text],
241
- outputs=[output_text]
242
  )
243
 
244
- # Aba de Interpretação
245
  with gr.Tab("Guia de Interpretação"):
246
  gr.Markdown("""
247
- ## Interpretação dos Resultados
248
-
249
- ### Níveis de Probabilidade
250
- - **>80%**: Alta probabilidade - Investigação prioritária
251
- - **60-80%**: Probabilidade moderada - Investigação recomendada
252
- - **40-60%**: Probabilidade média - Monitoramento
253
- - **<40%**: Baixa probabilidade - Observação
254
-
255
- ### Categorias de Doenças Analisadas
256
- 1. **Doenças Autoimunes**
257
- - Artrite Reumatoide
258
- - Lúpus
259
- - Esclerose Múltipla
260
 
261
- 2. **Doenças Endócrinas**
262
- - Hipotireoidismo
263
- - Diabetes
264
- - Doença de Addison
 
265
 
266
- 3. **Doenças Degenerativas**
267
- - Alzheimer
268
- - Parkinson
269
- - Osteoporose
 
270
 
271
- 4. **Doenças Inflamatórias**
272
- - Doença de Crohn
273
- - Colite Ulcerativa
274
- - Artrite
 
275
  """)
276
 
277
  # Aba de Recomendações
@@ -279,26 +294,27 @@ def criar_interface():
279
  gr.Markdown("""
280
  ## Recomendações Gerais
281
 
282
- ### Exames Complementares
283
- - Exames laboratoriais específicos
284
- - Exames de imagem
285
- - Avaliações funcionais
 
286
 
287
- ### Abordagens Terapêuticas
288
- 1. **Convencionais**
289
- - Medicamentos específicos
290
- - Acompanhamento médico
291
- - Fisioterapia
292
 
293
- 2. **Complementares**
294
- - Fitoterapia
295
- - Acupuntura
296
- - Homeopatia
297
 
298
- 3. **Mudanças de Estilo de Vida**
299
- - Alimentação
300
- - Exercícios
301
- - Gestão do estresse
302
  """)
303
 
304
  return interface
 
5
  import io
6
  from collections import defaultdict
7
 
8
+ def detectar_iris(imagem):
9
+ """
10
+ Detecta a íris na imagem e retorna a região de interesse
11
+ """
12
+ # Converter para escala de cinza
13
+ gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY)
14
+
15
+ # Aplicar blur para reduzir ruído
16
+ blur = cv2.GaussianBlur(gray, (7, 7), 0)
17
+
18
+ # Detectar círculos (íris) usando transformada de Hough
19
+ circles = cv2.HoughCircles(
20
+ blur,
21
+ cv2.HOUGH_GRADIENT,
22
+ dp=1,
23
+ minDist=50,
24
+ param1=50,
25
+ param2=30,
26
+ minRadius=50,
27
+ maxRadius=150
28
+ )
29
+
30
+ if circles is not None:
31
+ # Converter coordenadas para inteiros
32
+ circles = np.uint16(np.around(circles))
33
+
34
+ # Pegar o primeiro círculo detectado
35
+ x, y, r = circles[0][0]
36
+
37
+ # Criar máscara circular
38
+ mask = np.zeros_like(gray)
39
+ cv2.circle(mask, (x, y), r, 255, -1)
40
+
41
+ # Aplicar máscara na imagem original
42
+ result = cv2.bitwise_and(imagem, imagem, mask=mask)
43
+
44
+ # Recortar região da íris
45
+ roi = result[y-r:y+r, x-r:x+r]
46
+
47
+ return roi, (x, y, r)
48
+
49
+ return None, None
50
+
51
+ def analisar_textura(roi):
52
+ """
53
+ Analisa a textura da íris para identificar padrões
54
+ """
55
+ if roi is None:
56
+ return {}
57
+
58
+ # Converter para escala de cinza
59
+ gray = cv2.cvtColor(roi, cv2.COLOR_RGB2GRAY)
60
+
61
+ # Análises de textura
62
+ padroes = {
63
+ "congestao_inflamacao": False,
64
+ "deficiencia_hipofuncao": False,
65
+ "atrofia_degeneracao": False,
66
+ "irritacao_estresse": False
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  }
68
+
69
+ # Análise de variância local
70
+ kernel_size = 5
71
+ local_var = cv2.Laplacian(gray, cv2.CV_64F).var()
72
+
73
+ # Análise de intensidade média
74
+ mean_intensity = np.mean(gray)
75
+
76
+ # Análise de contraste
77
+ contrast = np.std(gray)
78
+
79
+ # Detecção de bordas
80
+ edges = cv2.Canny(gray, 100, 200)
81
+ edge_density = np.sum(edges) / (edges.shape[0] * edges.shape[1])
82
+
83
+ # Definir limiares para cada padrão
84
+ if local_var > 100:
85
+ padroes["congestao_inflamacao"] = True
86
+
87
+ if mean_intensity < 100:
88
+ padroes["deficiencia_hipofuncao"] = True
89
+
90
+ if contrast < 30:
91
+ padroes["atrofia_degeneracao"] = True
92
+
93
+ if edge_density > 0.1:
94
+ padroes["irritacao_estresse"] = True
95
+
96
+ return padroes
97
 
98
+ def analisar_setores(roi, centro, raio):
99
+ """
100
+ Analisa diferentes setores da íris
101
+ """
102
+ if roi is None:
103
+ return {}
104
+
105
+ setores = {
106
+ "superior": (315, 45), # Cérebro
107
+ "direito": (45, 135), # Fígado
108
+ "inferior": (135, 225), # Sistema Digestivo
109
+ "esquerdo": (225, 315) # Coração
110
+ }
111
+
112
+ resultados = {}
113
+
114
+ for setor, (ang_inicio, ang_fim) in setores.items():
115
+ # Criar máscara para o setor
116
+ mask = np.zeros_like(roi[:,:,0])
117
+ cv2.ellipse(mask,
118
+ (raio, raio),
119
+ (raio-10, raio-10),
120
+ 0,
121
+ ang_inicio,
122
+ ang_fim,
123
+ 255,
124
+ -1)
125
+
126
+ # Aplicar máscara
127
+ setor_roi = cv2.bitwise_and(roi, roi, mask=mask)
128
+
129
+ # Analisar textura do setor
130
+ resultados[setor] = analisar_textura(setor_roi)
131
+
132
+ return resultados
133
+
134
+ def gerar_diagnostico(padroes, setores):
135
+ """
136
+ Gera diagnóstico baseado nos padrões encontrados
137
+ """
138
+ diagnostico = []
139
+
140
+ # Mapeamento de padrões para possíveis condições
141
+ mapa_condicoes = {
142
+ "congestao_inflamacao": [
143
+ "Processo inflamatório ativo",
144
+ "Possível condição autoimune",
145
+ "Inflamação crônica"
146
+ ],
147
+ "deficiencia_hipofuncao": [
148
+ "Deficiência nutricional",
149
+ "Hipofunção glandular",
150
+ "Fadiga crônica"
151
+ ],
152
+ "atrofia_degeneracao": [
153
+ "Desgaste tecidual",
154
+ "Processo degenerativo",
155
+ "Envelhecimento acelerado"
156
+ ],
157
+ "irritacao_estresse": [
158
+ "Estresse crônico",
159
+ "Sobrecarga do sistema nervoso",
160
+ "Ansiedade"
161
  ]
162
  }
163
+
164
+ # Analisar padrões gerais
165
+ for padrao, presente in padroes.items():
166
+ if presente:
167
+ diagnostico.extend(mapa_condicoes[padrao])
168
+
169
+ # Analisar setores específicos
170
+ for setor, padroes_setor in setores.items():
171
+ for padrao, presente in padroes_setor.items():
172
+ if presente:
173
+ if setor == "superior":
174
+ diagnostico.append(f"Região cerebral: {mapa_condicoes[padrao][0]}")
175
+ elif setor == "direito":
176
+ diagnostico.append(f"Região hepática: {mapa_condicoes[padrao][0]}")
177
+ elif setor == "inferior":
178
+ diagnostico.append(f"Região digestiva: {mapa_condicoes[padrao][0]}")
179
+ elif setor == "esquerdo":
180
+ diagnostico.append(f"Região cardíaca: {mapa_condicoes[padrao][0]}")
181
+
182
+ return list(set(diagnostico)) # Remover duplicatas
183
 
184
+ def processar_imagem(imagem):
185
  """
186
+ Processa a imagem da íris e retorna análise
187
  """
188
+ # Converter imagem para formato OpenCV
189
+ img_array = np.array(imagem)
190
+
191
+ # Detectar íris
192
+ roi, (x, y, r) = detectar_iris(img_array)
193
+ if roi is None:
194
+ return "Não foi possível detectar a íris na imagem."
195
+
196
+ # Analisar padrões gerais
197
+ padroes = analisar_textura(roi)
198
+
199
+ # Analisar setores
200
+ setores = analisar_setores(roi, (x, y), r)
201
+
202
+ # Gerar diagnóstico
203
+ diagnostico = gerar_diagnostico(padroes, setores)
204
+
205
+ # Gerar visualização
206
+ output_img = img_array.copy()
207
+ cv2.circle(output_img, (x, y), r, (0, 255, 0), 2)
208
+
209
+ # Desenhar setores
210
+ ang_step = 45
211
+ for ang in range(0, 360, ang_step):
212
+ end_x = int(x + r * np.cos(np.radians(ang)))
213
+ end_y = int(y + r * np.sin(np.radians(ang)))
214
+ cv2.line(output_img, (x, y), (end_x, end_y), (0, 255, 0), 1)
215
+
216
+ return output_img, "\n".join(diagnostico)
 
 
 
 
 
 
 
 
217
 
218
  def criar_interface():
219
  """
220
+ Cria interface moderna do Gradio
221
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
  # Tema personalizado verde piscina
223
  theme = gr.themes.Soft(
224
  primary_hue="teal",
 
230
  input_background_fill="#E9F5F3",
231
  button_primary_background_fill="#2A9D8F",
232
  button_primary_background_fill_dark="#264653",
 
 
233
  )
234
+
235
+ # Interface
236
+ with gr.Blocks(theme=theme, title="Análise Iridológica por Imagem") as interface:
237
  gr.Markdown("""
238
+ # Sistema Avançado de Análise Iridológica
239
+ ### Análise automatizada de imagens da íris
240
  """)
241
 
242
  with gr.Tabs():
243
+ # Aba de Análise
244
+ with gr.Tab("Análise de Imagem"):
245
+ with gr.Row():
246
+ with gr.Column():
247
+ input_image = gr.Image(
248
+ label="Imagem da Íris",
249
+ type="pil"
250
+ )
251
+ with gr.Column():
252
+ output_image = gr.Image(
253
+ label="Íris Analisada"
254
+ )
255
+
256
+ analysis_btn = gr.Button("Analisar Íris", variant="primary")
257
  output_text = gr.Textbox(
258
+ label="Diagnóstico",
259
+ lines=10
260
  )
261
 
262
  analysis_btn.click(
263
+ fn=processar_imagem,
264
+ inputs=[input_image],
265
+ outputs=[output_image, output_text]
266
  )
267
 
268
+ # Aba de Guia
269
  with gr.Tab("Guia de Interpretação"):
270
  gr.Markdown("""
271
+ ## Interpretação dos Sinais
 
 
 
 
 
 
 
 
 
 
 
 
272
 
273
+ ### Padrões Principais
274
+ - **Congestão/Inflamação**: Áreas escuras ou densas
275
+ - **Deficiência/Hipofunção**: Áreas claras ou vazias
276
+ - **Atrofia/Degeneração**: Lacunas ou descontinuidades
277
+ - **Irritação/Estresse**: Linhas radiais ou manchas
278
 
279
+ ### Setores da Íris
280
+ 1. **Superior**: Região cerebral
281
+ 2. **Direito**: Região hepática
282
+ 3. **Inferior**: Região digestiva
283
+ 4. **Esquerdo**: Região cardíaca
284
 
285
+ ### Recomendações
286
+ - Faça a foto com boa iluminação
287
+ - Mantenha o olho bem aberto
288
+ - Evite reflexos na imagem
289
+ - Use câmera com boa resolução
290
  """)
291
 
292
  # Aba de Recomendações
 
294
  gr.Markdown("""
295
  ## Recomendações Gerais
296
 
297
+ ### Qualidade da Imagem
298
+ - Resolução mínima: 1280x720
299
+ - Iluminação uniforme
300
+ - Foco na íris
301
+ - Sem reflexos
302
 
303
+ ### Preparação
304
+ 1. **Ambiente**
305
+ - Bem iluminado
306
+ - Sem luz direta
307
+ - Fundo claro
308
 
309
+ 2. **Posicionamento**
310
+ - Olho bem aberto
311
+ - Câmera estável
312
+ - Distância adequada
313
 
314
+ 3. **Momento**
315
+ - Evite olhos irritados
316
+ - Preferencialmente pela manhã
317
+ - Após descanso
318
  """)
319
 
320
  return interface