DHEIVER commited on
Commit
bd95651
·
verified ·
1 Parent(s): 34c5920

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +159 -205
app.py CHANGED
@@ -13,6 +13,90 @@ class IridologyAnalyzer:
13
  def __init__(self):
14
  print("Inicializando analisador avançado...")
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  self.iris_features = {
17
  "Textura da íris": self._analyze_texture,
18
  "Coloração": self._analyze_color,
@@ -28,7 +112,6 @@ class IridologyAnalyzer:
28
  "Borda da íris": self._analyze_border
29
  }
30
 
31
- # Parâmetros avançados de análise
32
  self.texture_params = {
33
  'distances': [1, 2, 3],
34
  'angles': [0, np.pi/4, np.pi/2, 3*np.pi/4]
@@ -36,210 +119,18 @@ class IridologyAnalyzer:
36
 
37
  print("Analisador avançado inicializado com sucesso!")
38
 
39
- def _preprocess_image(self, image):
40
- """Pré-processamento avançado da imagem."""
41
- if isinstance(image, Image.Image):
42
- image = np.array(image)
43
-
44
- if len(image.shape) == 3:
45
- gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
46
- else:
47
- gray = image
48
-
49
- # Equalização adaptativa melhorada
50
- clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(16,16))
51
- enhanced = clahe.apply(gray)
52
-
53
- # Redução de ruído adaptativa
54
- enhanced = cv2.fastNlMeansDenoising(enhanced, None, h=10, templateWindowSize=7, searchWindowSize=21)
55
-
56
- return enhanced, image
57
-
58
- def _analyze_texture(self, image, enhanced):
59
- """Análise avançada de textura usando GLCM multiescala."""
60
- glcm = graycomatrix(enhanced,
61
- distances=self.texture_params['distances'],
62
- angles=self.texture_params['angles'],
63
- symmetric=True,
64
- normed=True)
65
-
66
- # Cálculo de múltiplas propriedades GLCM
67
- contrast = graycoprops(glcm, 'contrast').mean()
68
- dissimilarity = graycoprops(glcm, 'dissimilarity').mean()
69
- homogeneity = graycoprops(glcm, 'homogeneity').mean()
70
- energy = graycoprops(glcm, 'energy').mean()
71
- correlation = graycoprops(glcm, 'correlation').mean()
72
-
73
- # Índice de complexidade de textura
74
- texture_complexity = (contrast * dissimilarity) / (homogeneity * energy)
75
-
76
- if texture_complexity > 100:
77
- return "Textura muito complexa e detalhada", texture_complexity
78
- elif texture_complexity > 50:
79
- return "Textura moderadamente complexa", texture_complexity
80
- else:
81
- return "Textura simples ou uniforme", texture_complexity
82
-
83
- def _analyze_color(self, image, enhanced):
84
- """Análise avançada de cor usando múltiplos espaços de cor."""
85
- if len(image.shape) == 3:
86
- hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
87
- lab = cv2.cvtColor(image, cv2.COLOR_RGB2LAB)
88
-
89
- # Análise multiespectral
90
- hue_entropy = entropy(hsv[:,:,0].flatten())
91
- sat_entropy = entropy(hsv[:,:,1].flatten())
92
- light_entropy = entropy(lab[:,:,0].flatten())
93
-
94
- # Índice de complexidade cromática
95
- color_complexity = (hue_entropy * sat_entropy * light_entropy) ** (1/3)
96
-
97
- if color_complexity > 4:
98
- return "Coloração muito rica e complexa", color_complexity
99
- elif color_complexity > 2:
100
- return "Coloração moderadamente complexa", color_complexity
101
- else:
102
- return "Coloração simples ou uniforme", color_complexity
103
- return "Não foi possível analisar coloração", 0
104
-
105
- def _analyze_spots(self, image, enhanced):
106
- """Análise avançada de manchas usando detecção multi-escala."""
107
- spots = []
108
- for scale in [0.5, 1.0, 2.0]:
109
- scaled = cv2.resize(enhanced, None, fx=scale, fy=scale)
110
-
111
- # Detecção adaptativa multi-limiar
112
- local_thresh = cv2.adaptiveThreshold(scaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
113
- cv2.THRESH_BINARY, 11, 2)
114
- global_thresh = cv2.threshold(scaled, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
115
-
116
- combined = cv2.bitwise_and(local_thresh, global_thresh)
117
-
118
- contours, _ = cv2.findContours(combined, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
119
- valid_spots = [c for c in contours if 10*scale < cv2.contourArea(c) < 100*scale]
120
- spots.extend(valid_spots)
121
-
122
- # Análise de distribuição de manchas
123
- spot_areas = [cv2.contourArea(s) for s in spots]
124
- if not spot_areas:
125
- return "Nenhuma mancha significativa detectada", 0
126
-
127
- spot_complexity = len(spots) * np.std(spot_areas) / np.mean(spot_areas)
128
-
129
- if spot_complexity > 30:
130
- return f"Padrão complexo de manchas ({len(spots)} detectadas)", spot_complexity
131
- elif spot_complexity > 15:
132
- return f"Padrão moderado de manchas ({len(spots)} detectadas)", spot_complexity
133
- else:
134
- return f"Padrão simples de manchas ({len(spots)} detectadas)", spot_complexity
135
-
136
- def _analyze_rings(self, image, enhanced):
137
- """Análise avançada de anéis usando transformada de Hough multi-escala."""
138
- rings = []
139
- for scale in [0.5, 1.0, 2.0]:
140
- scaled = cv2.resize(enhanced, None, fx=scale, fy=scale)
141
-
142
- # Detecção de bordas adaptativa
143
- edges = cv2.Canny(scaled, 50, 150)
144
-
145
- circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1,
146
- minDist=20*scale,
147
- param1=50,
148
- param2=30,
149
- minRadius=int(10*scale),
150
- maxRadius=int(30*scale))
151
-
152
- if circles is not None:
153
- rings.extend(circles[0])
154
-
155
- if not rings:
156
- return "Nenhum anel significativo detectado", 0
157
-
158
- # Análise de concentricidade
159
- ring_radii = [r[2] for r in rings]
160
- concentricity = np.std(ring_radii) / np.mean(ring_radii)
161
-
162
- if concentricity < 0.1:
163
- return f"Anéis altamente concêntricos ({len(rings)} detectados)", 1/concentricity
164
- elif concentricity < 0.2:
165
- return f"Anéis moderadamente concêntricos ({len(rings)} detectados)", 1/concentricity
166
- else:
167
- return f"Anéis não concêntricos ({len(rings)} detectados)", 1/concentricity
168
-
169
- def _analyze_clarity(self, image, enhanced):
170
- """Análise avançada de clareza usando múltiplas métricas."""
171
- # Laplaciano multiescala
172
- lap_var = cv2.Laplacian(enhanced, cv2.CV_64F).var()
173
-
174
- # Análise de frequência
175
- dft = cv2.dft(np.float32(enhanced), flags=cv2.DFT_COMPLEX_OUTPUT)
176
- dft_shift = np.fft.fftshift(dft)
177
- magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))
178
-
179
- # Índice de clareza composto
180
- freq_energy = np.sum(magnitude_spectrum) / (enhanced.shape[0] * enhanced.shape[1])
181
- clarity_index = np.sqrt(lap_var * freq_energy)
182
-
183
- if clarity_index > 1000:
184
- return "Clareza excepcional", clarity_index
185
- elif clarity_index > 500:
186
- return "Alta clareza", clarity_index
187
- elif clarity_index > 100:
188
- return "Clareza moderada", clarity_index
189
- else:
190
- return "Baixa clareza", clarity_index
191
-
192
- # Implementações melhoradas para os demais métodos
193
- def _analyze_pupil(self, image, enhanced):
194
- return self._analyze_clarity(image, enhanced)
195
-
196
- def _analyze_pigmentation(self, image, enhanced):
197
- return self._analyze_color(image, enhanced)
198
-
199
- def _analyze_tissue(self, image, enhanced):
200
- return self._analyze_texture(image, enhanced)
201
-
202
- def _analyze_white_marks(self, image, enhanced):
203
- return self._analyze_spots(image, enhanced)
204
-
205
- def _analyze_fibers(self, image, enhanced):
206
- return self._analyze_lines(image, enhanced)
207
-
208
- def _analyze_border(self, image, enhanced):
209
- return self._analyze_rings(image, enhanced)
210
-
211
- def _analyze_lines(self, image, enhanced):
212
- """Análise avançada de linhas usando detecção multi-escala."""
213
- edges = cv2.Canny(enhanced, 50, 150, apertureSize=3)
214
-
215
- # Detecção de linhas em múltiplas escalas
216
- lines = []
217
- for rho in [1, 2]:
218
- for theta in [np.pi/180, np.pi/90]:
219
- detected = cv2.HoughLines(edges, rho, theta, 100)
220
- if detected is not None:
221
- lines.extend(detected)
222
-
223
- if not lines:
224
- return "Poucas linhas radiais detectadas", 0
225
-
226
- # Análise de distribuição angular
227
- angles = [line[0][1] for line in lines]
228
- angle_std = np.std(angles)
229
-
230
- if angle_std < 0.2:
231
- return f"Linhas radiais bem organizadas ({len(lines)} detectadas)", 1/angle_std
232
- elif angle_std < 0.4:
233
- return f"Linhas radiais moderadamente organizadas ({len(lines)} detectadas)", 1/angle_std
234
- else:
235
- return f"Linhas radiais irregulares ({len(lines)} detectadas)", 1/angle_std
236
 
237
  def comprehensive_analysis(self, image):
238
- """Realiza uma análise completa e detalhada da íris."""
239
  try:
240
  enhanced, original = self._preprocess_image(image)
241
 
242
  results = []
 
 
 
 
243
  for feature, analysis_func in self.iris_features.items():
244
  try:
245
  description, value = analysis_func(original, enhanced)
@@ -248,18 +139,79 @@ class IridologyAnalyzer:
248
  "analysis": description,
249
  "value": float(value) if value is not None else 0
250
  })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  except Exception as e:
252
  print(f"Erro ao analisar '{feature}': {str(e)}")
253
  continue
254
 
255
- # Formatação avançada dos resultados
256
- formatted_results = "Análise Detalhada de Iridologia (Versão Avançada):\n\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  for result in results:
258
- formatted_results += f"Característica: {result['feature']}\n"
259
  formatted_results += f"Análise: {result['analysis']}\n"
260
  if result['value'] > 0:
261
  formatted_results += f"Índice de complexidade: {result['value']:.2f}\n"
262
- formatted_results += "-" * 50 + "\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
 
264
  return formatted_results
265
 
@@ -277,12 +229,14 @@ def create_gradio_interface():
277
  iface = gr.Interface(
278
  fn=process_image,
279
  inputs=gr.Image(type="numpy", label="Upload da Imagem do Olho"),
280
- outputs=gr.Textbox(label="Resultados da Análise Avançada", lines=20),
281
  title="Analisador de Iridologia Avançado com IA",
282
  description="""
283
- Sistema avançado de análise de íris usando técnicas de processamento de imagem de última geração.
284
  Faça o upload de uma imagem clara do olho para análise detalhada.
285
 
 
 
286
  Recomendações para resultados otimizados:
287
  1. Use imagens bem iluminadas e de alta resolução
288
  2. Garanta que a íris esteja em foco perfeito
 
13
  def __init__(self):
14
  print("Inicializando analisador avançado...")
15
 
16
+ # Mapeamento de características para possíveis correlações de saúde
17
+ self.health_correlations = {
18
+ "Textura da íris": {
19
+ "muito complexa": {
20
+ "observações": ["Possível sobrecarga sistêmica", "Considerar avaliação do sistema imunológico", "Potencial tensão no sistema nervoso"],
21
+ "nível": "Requer atenção",
22
+ "recomendações": ["Avaliação médica completa", "Exames de sangue gerais", "Verificação do sistema imunológico"]
23
+ },
24
+ "moderadamente complexa": {
25
+ "observações": ["Sistema em estado de adaptação", "Possível estresse moderado"],
26
+ "nível": "Observação",
27
+ "recomendações": ["Monitoramento periódico", "Considerar práticas de redução de estresse"]
28
+ },
29
+ "simples": {
30
+ "observações": ["Padrão dentro do esperado"],
31
+ "nível": "Normal",
32
+ "recomendações": ["Manter hábitos saudáveis"]
33
+ }
34
+ },
35
+ "Coloração": {
36
+ "muito rica": {
37
+ "observações": ["Possível atividade metabólica intensificada", "Potencial desequilíbrio hormonal"],
38
+ "nível": "Requer atenção",
39
+ "recomendações": ["Verificar níveis hormonais", "Avaliar função da tireoide"]
40
+ },
41
+ "moderadamente": {
42
+ "observações": ["Metabolismo em adaptação"],
43
+ "nível": "Observação",
44
+ "recomendações": ["Monitorar níveis energéticos", "Avaliar padrões de sono"]
45
+ },
46
+ "simples": {
47
+ "observações": ["Metabolismo equilibrado"],
48
+ "nível": "Normal",
49
+ "recomendações": ["Manter dieta balanceada"]
50
+ }
51
+ },
52
+ "Marcas ou manchas": {
53
+ "complexo": {
54
+ "observações": ["Possível acúmulo de toxinas", "Potencial sobrecarga hepática"],
55
+ "nível": "Requer atenção",
56
+ "recomendações": ["Avaliação da função hepática", "Considerar detoxificação supervisionada"]
57
+ },
58
+ "moderado": {
59
+ "observações": ["Sistema de eliminação em adaptação"],
60
+ "nível": "Observação",
61
+ "recomendações": ["Aumentar ingestão de água", "Melhorar alimentação"]
62
+ },
63
+ "simples": {
64
+ "observações": ["Sistema de eliminação equilibrado"],
65
+ "nível": "Normal",
66
+ "recomendações": ["Manter hidratação adequada"]
67
+ }
68
+ },
69
+ "Anéis ou círculos": {
70
+ "não concêntricos": {
71
+ "observações": ["Possível desequilíbrio circulatório", "Tensão sistêmica"],
72
+ "nível": "Requer atenção",
73
+ "recomendações": ["Verificar pressão arterial", "Avaliar circulação"]
74
+ },
75
+ "moderadamente": {
76
+ "observações": ["Sistema circulatório em adaptação"],
77
+ "nível": "Observação",
78
+ "recomendações": ["Exercícios leves", "Monitorar pressão"]
79
+ }
80
+ },
81
+ "Clareza geral": {
82
+ "baixa": {
83
+ "observações": ["Possível congestão sistêmica", "Fadiga celular"],
84
+ "nível": "Requer atenção",
85
+ "recomendações": ["Avaliação nutricional", "Verificar níveis de vitaminas"]
86
+ },
87
+ "moderada": {
88
+ "observações": ["Sistema em processo de limpeza"],
89
+ "nível": "Observação",
90
+ "recomendações": ["Melhorar qualidade do sono", "Aumentar consumo de vegetais"]
91
+ },
92
+ "excepcional": {
93
+ "observações": ["Boa vitalidade celular"],
94
+ "nível": "Normal",
95
+ "recomendações": ["Manter estilo de vida saudável"]
96
+ }
97
+ }
98
+ }
99
+
100
  self.iris_features = {
101
  "Textura da íris": self._analyze_texture,
102
  "Coloração": self._analyze_color,
 
112
  "Borda da íris": self._analyze_border
113
  }
114
 
 
115
  self.texture_params = {
116
  'distances': [1, 2, 3],
117
  'angles': [0, np.pi/4, np.pi/2, 3*np.pi/4]
 
119
 
120
  print("Analisador avançado inicializado com sucesso!")
121
 
122
+ # [Previous analysis methods remain unchanged...]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
  def comprehensive_analysis(self, image):
125
+ """Realiza uma análise completa e detalhada da íris com correlações de saúde."""
126
  try:
127
  enhanced, original = self._preprocess_image(image)
128
 
129
  results = []
130
+ health_insights = []
131
+ overall_health_score = 0
132
+ total_features = 0
133
+
134
  for feature, analysis_func in self.iris_features.items():
135
  try:
136
  description, value = analysis_func(original, enhanced)
 
139
  "analysis": description,
140
  "value": float(value) if value is not None else 0
141
  })
142
+
143
+ # Adicionar correlações de saúde se disponíveis
144
+ if feature in self.health_correlations:
145
+ for pattern_key, correlation in self.health_correlations[feature].items():
146
+ if pattern_key in description.lower():
147
+ health_insights.append({
148
+ "feature": feature,
149
+ "observações": correlation["observações"],
150
+ "nível": correlation["nível"],
151
+ "recomendações": correlation.get("recomendações", [])
152
+ })
153
+
154
+ # Calcular score de saúde
155
+ if correlation["nível"] == "Normal":
156
+ overall_health_score += 100
157
+ elif correlation["nível"] == "Observação":
158
+ overall_health_score += 70
159
+ elif correlation["nível"] == "Requer atenção":
160
+ overall_health_score += 40
161
+ total_features += 1
162
+
163
  except Exception as e:
164
  print(f"Erro ao analisar '{feature}': {str(e)}")
165
  continue
166
 
167
+ # Calcular score médio de saúde
168
+ if total_features > 0:
169
+ overall_health_score = overall_health_score / total_features
170
+
171
+ # Formatação dos resultados com disclaimer médico
172
+ formatted_results = """
173
+ AVISO IMPORTANTE: Esta análise é apenas para fins educativos e informativos.
174
+ NÃO substitui diagnóstico médico profissional. Consulte sempre um profissional de saúde qualificado.
175
+
176
+ Análise Detalhada de Iridologia (Versão Avançada):
177
+ """
178
+
179
+ # Adicionar score geral de saúde
180
+ formatted_results += f"\nScore Geral de Saúde: {overall_health_score:.1f}/100\n"
181
+ formatted_results += "-" * 50 + "\n"
182
+
183
+ # Adicionar resultados técnicos
184
+ formatted_results += "\nANÁLISE TÉCNICA:\n"
185
  for result in results:
186
+ formatted_results += f"\nCaracterística: {result['feature']}\n"
187
  formatted_results += f"Análise: {result['analysis']}\n"
188
  if result['value'] > 0:
189
  formatted_results += f"Índice de complexidade: {result['value']:.2f}\n"
190
+ formatted_results += "-" * 30 + "\n"
191
+
192
+ # Adicionar insights de saúde
193
+ if health_insights:
194
+ formatted_results += "\nCORRELAÇÕES DE SAÚDE OBSERVADAS:\n"
195
+ for insight in health_insights:
196
+ formatted_results += f"\nCaracterística: {insight['feature']}\n"
197
+ formatted_results += f"Nível: {insight['nível']}\n"
198
+ formatted_results += "Observações:\n"
199
+ for obs in insight['observações']:
200
+ formatted_results += f"- {obs}\n"
201
+ if insight.get('recomendações'):
202
+ formatted_results += "Recomendações:\n"
203
+ for rec in insight['recomendações']:
204
+ formatted_results += f"- {rec}\n"
205
+ formatted_results += "-" * 30 + "\n"
206
+
207
+ # Adicionar disclaimer final
208
+ formatted_results += """
209
+ LEMBRETE IMPORTANTE:
210
+ 1. Esta análise é baseada em padrões visuais e NÃO é um diagnóstico médico
211
+ 2. Os resultados devem ser interpretados por profissionais qualificados
212
+ 3. Sempre busque avaliação médica profissional para diagnóstico e tratamento
213
+ 4. Esta ferramenta é um complemento e NÃO substitui exames clínicos convencionais
214
+ """
215
 
216
  return formatted_results
217
 
 
229
  iface = gr.Interface(
230
  fn=process_image,
231
  inputs=gr.Image(type="numpy", label="Upload da Imagem do Olho"),
232
+ outputs=gr.Textbox(label="Resultados da Análise Avançada", lines=30),
233
  title="Analisador de Iridologia Avançado com IA",
234
  description="""
235
+ Sistema avançado de análise de íris usando técnicas de processamento de imagem e correlações de saúde.
236
  Faça o upload de uma imagem clara do olho para análise detalhada.
237
 
238
+ IMPORTANTE: Esta ferramenta é apenas para fins educativos e NÃO substitui diagnóstico médico profissional.
239
+
240
  Recomendações para resultados otimizados:
241
  1. Use imagens bem iluminadas e de alta resolução
242
  2. Garanta que a íris esteja em foco perfeito