DHEIVER commited on
Commit
97e70e4
·
verified ·
1 Parent(s): 6f86360

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -12
app.py CHANGED
@@ -194,39 +194,81 @@ class IrisAnalyzer:
194
  ]
195
 
196
  def analyze_iris(self, image: np.ndarray) -> Dict:
 
197
  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
198
- center = (image.shape[1]//2, image.shape[0]//2)
199
- radius = min(image.shape[:2])//4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
 
201
  results = {
202
  "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
203
  "analysis": {},
204
- "recommendations": []
 
 
 
205
  }
206
 
207
  for zone in self.zones:
208
  inner_r = int(radius * zone.ratio[0])
209
  outer_r = int(radius * zone.ratio[1])
210
 
 
211
  mask = np.zeros(gray.shape, dtype=np.uint8)
212
  cv2.circle(mask, center, outer_r, 255, -1)
213
  cv2.circle(mask, center, inner_r, 0, -1)
214
 
215
- zone_intensity = cv2.mean(gray, mask=mask)[0]
 
 
 
 
 
 
 
216
 
217
- # Análise detalhada baseada na intensidade
218
- if zone_intensity < 85:
 
 
 
 
 
 
 
 
219
  level = "baixa"
220
- elif zone_intensity < 170:
221
  level = "media"
222
  else:
223
  level = "alta"
224
 
225
  results["analysis"][zone.name] = {
226
- "conditions": zone.conditions[level],
227
- "recommendations": zone.recommendations[level],
228
- "intensity": float(zone_intensity),
229
- "status": level
 
 
 
 
 
 
 
 
230
  }
231
 
232
  # Marcar zona na imagem
@@ -237,7 +279,52 @@ class IrisAnalyzer:
237
 
238
  return image, results
239
 
240
- def process_image(img):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  if img is None:
242
  return [None] * 5, gr.Warning("Por favor, carregue uma imagem.")
243
 
 
194
  ]
195
 
196
  def analyze_iris(self, image: np.ndarray) -> Dict:
197
+ # Converter para diferentes espaços de cor para análise mais completa
198
  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
199
+ hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
200
+ lab = cv2.cvtColor(image, cv2.COLOR_RGB2LAB)
201
+
202
+ # Detectar centro e borda da íris usando Hough Circles
203
+ circles = cv2.HoughCircles(
204
+ gray, cv2.HOUGH_GRADIENT, dp=1, minDist=100,
205
+ param1=50, param2=30, minRadius=50, maxRadius=150
206
+ )
207
+
208
+ if circles is not None:
209
+ circle = circles[0][0]
210
+ center = (int(circle[0]), int(circle[1]))
211
+ radius = int(circle[2])
212
+ else:
213
+ center = (image.shape[1]//2, image.shape[0]//2)
214
+ radius = min(image.shape[:2])//4
215
 
216
  results = {
217
  "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
218
  "analysis": {},
219
+ "metrics": {
220
+ "iris_radius": radius,
221
+ "image_quality": self._assess_image_quality(image)
222
+ }
223
  }
224
 
225
  for zone in self.zones:
226
  inner_r = int(radius * zone.ratio[0])
227
  outer_r = int(radius * zone.ratio[1])
228
 
229
+ # Criar máscaras para diferentes análises
230
  mask = np.zeros(gray.shape, dtype=np.uint8)
231
  cv2.circle(mask, center, outer_r, 255, -1)
232
  cv2.circle(mask, center, inner_r, 0, -1)
233
 
234
+ # Análise multiespectral
235
+ zone_metrics = {
236
+ "intensity": cv2.mean(gray, mask=mask)[0],
237
+ "saturation": cv2.mean(hsv[..., 1], mask=mask)[0],
238
+ "texture": self._analyze_texture(gray, mask),
239
+ "contrast": self._analyze_contrast(lab[..., 0], mask),
240
+ "patterns": self._detect_patterns(gray, mask)
241
+ }
242
 
243
+ # Análise detalhada baseada em múltiplos fatores
244
+ health_score = (
245
+ zone_metrics["intensity"] * 0.3 +
246
+ zone_metrics["saturation"] * 0.2 +
247
+ zone_metrics["texture"] * 0.2 +
248
+ zone_metrics["contrast"] * 0.15 +
249
+ zone_metrics["patterns"] * 0.15
250
+ )
251
+
252
+ if health_score < 40:
253
  level = "baixa"
254
+ elif health_score < 75:
255
  level = "media"
256
  else:
257
  level = "alta"
258
 
259
  results["analysis"][zone.name] = {
260
+ "conditions": self._customize_conditions(zone.conditions[level], zone_metrics),
261
+ "recommendations": self._customize_recommendations(zone.recommendations[level], zone_metrics),
262
+ "metrics": {
263
+ "intensity": float(zone_metrics["intensity"]),
264
+ "saturation": float(zone_metrics["saturation"]),
265
+ "texture": float(zone_metrics["texture"]),
266
+ "contrast": float(zone_metrics["contrast"]),
267
+ "patterns": float(zone_metrics["patterns"]),
268
+ "health_score": float(health_score)
269
+ },
270
+ "status": level,
271
+ "confianca_analise": self._calculate_confidence(zone_metrics)
272
  }
273
 
274
  # Marcar zona na imagem
 
279
 
280
  return image, results
281
 
282
+ def _customize_conditions(self, base_conditions: List[str], metrics: Dict) -> List[str]:
283
+ """Personaliza as condições baseado nas métricas específicas"""
284
+ customized = []
285
+ for condition in base_conditions:
286
+ # Adicionar detalhes específicos baseados nas métricas
287
+ if metrics["intensity"] < 50:
288
+ condition += " (intensidade muito baixa)"
289
+ elif metrics["contrast"] < 30:
290
+ condition += " (baixo contraste)"
291
+
292
+ if metrics["patterns"] > 70:
293
+ condition += " (padrões significativos detectados)"
294
+
295
+ customized.append(condition)
296
+ return customized
297
+
298
+ def _customize_recommendations(self, base_recommendations: List[str], metrics: Dict) -> List[str]:
299
+ """Personaliza as recomendações baseado nas métricas específicas"""
300
+ customized = []
301
+ for rec in base_recommendations:
302
+ # Adicionar detalhes específicos baseados nas métricas
303
+ if metrics["texture"] < 40:
304
+ rec += " (prioridade alta)"
305
+ elif metrics["saturation"] < 50:
306
+ rec += " (atenção especial necessária)"
307
+
308
+ customized.append(rec)
309
+ return customized
310
+
311
+ def _calculate_confidence(self, metrics: Dict) -> str:
312
+ """Calcula o nível de confiança da análise baseado nas métricas"""
313
+ confidence_score = (
314
+ metrics["intensity"] * 0.25 +
315
+ metrics["contrast"] * 0.25 +
316
+ metrics["texture"] * 0.25 +
317
+ metrics["patterns"] * 0.25
318
+ )
319
+
320
+ if confidence_score > 75:
321
+ return "alta"
322
+ elif confidence_score > 50:
323
+ return "média"
324
+ else:
325
+ return "baixa"
326
+
327
+ def process_image(img):
328
  if img is None:
329
  return [None] * 5, gr.Warning("Por favor, carregue uma imagem.")
330