Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
199 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
200 |
|
201 |
results = {
|
202 |
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
203 |
"analysis": {},
|
204 |
-
"
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
|
217 |
-
# Análise detalhada baseada
|
218 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
219 |
level = "baixa"
|
220 |
-
elif
|
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 |
-
"
|
229 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
230 |
}
|
231 |
|
232 |
# Marcar zona na imagem
|
@@ -237,7 +279,52 @@ class IrisAnalyzer:
|
|
237 |
|
238 |
return image, results
|
239 |
|
240 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|