Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -298,72 +298,78 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
298 |
"""
|
299 |
if iris_info is None or pupil_info is None:
|
300 |
return {}
|
301 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
302 |
ix, iy, ir = iris_info
|
303 |
px, py, pr = pupil_info
|
304 |
-
|
305 |
# Converter para escala de cinza
|
306 |
gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY)
|
307 |
-
|
308 |
# Equalização adaptativa do histograma
|
309 |
-
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(4,4))
|
310 |
gray = clahe.apply(gray)
|
311 |
-
|
312 |
# Criar máscara anelar da íris
|
313 |
mask_iris = np.zeros_like(gray)
|
314 |
cv2.circle(mask_iris, (ix, iy), int(ir * 0.98), 255, -1)
|
315 |
cv2.circle(mask_iris, (px, py), int(pr * 1.02), 0, -1)
|
316 |
-
|
317 |
# Dividir em 12 setores
|
318 |
setores = {}
|
319 |
for i in range(12):
|
320 |
ang_inicio = i * 30
|
321 |
ang_fim = (i + 1) * 30
|
322 |
-
|
323 |
# Criar máscara do setor
|
324 |
mask_setor = np.zeros_like(gray)
|
325 |
cv2.ellipse(mask_setor,
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
# Combinar máscaras
|
335 |
-
kernel = np.ones((2,2), np.uint8)
|
336 |
mask_final = cv2.bitwise_and(mask_iris, mask_setor)
|
337 |
mask_final = cv2.morphologyEx(mask_final, cv2.MORPH_OPEN, kernel)
|
338 |
-
|
339 |
# Extrair região do setor
|
340 |
setor_roi = cv2.bitwise_and(gray, gray, mask=mask_final)
|
341 |
-
|
342 |
# Análise de textura
|
343 |
non_zero = setor_roi[setor_roi > 0]
|
344 |
if len(non_zero) > 100:
|
345 |
-
# Normalização específica para GLCM
|
346 |
non_zero = ((non_zero - non_zero.min()) /
|
347 |
-
|
348 |
-
|
349 |
# Reshape para matriz 2D
|
350 |
tamanho_janela = int(np.sqrt(len(non_zero)))
|
351 |
if tamanho_janela > 1:
|
352 |
matriz_2d = non_zero[:tamanho_janela**2].reshape(tamanho_janela, tamanho_janela)
|
353 |
-
|
354 |
try:
|
355 |
# GLCM com 16 níveis
|
356 |
glcm = graycomatrix(matriz_2d,
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
|
363 |
# Calcular propriedades
|
364 |
contraste = np.mean(graycoprops(glcm, 'contrast'))
|
365 |
homogeneidade = np.mean(graycoprops(glcm, 'homogeneity'))
|
366 |
-
|
367 |
setores[f"setor_{i+1}"] = {
|
368 |
"contraste": float(contraste),
|
369 |
"homogeneidade": float(homogeneidade),
|
@@ -392,9 +398,9 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
392 |
"media": 0.0,
|
393 |
"std": 0.0
|
394 |
}
|
395 |
-
|
396 |
-
return setores
|
397 |
|
|
|
|
|
398 |
def avaliar_setores(setores):
|
399 |
"""
|
400 |
Avalia os setores com limiares recalibrados baseados nos dados observados
|
|
|
298 |
"""
|
299 |
if iris_info is None or pupil_info is None:
|
300 |
return {}
|
301 |
+
|
302 |
+
# Ensure iris_info and pupil_info are numpy arrays
|
303 |
+
if isinstance(iris_info, tuple):
|
304 |
+
iris_info = np.array(iris_info)
|
305 |
+
if isinstance(pupil_info, tuple):
|
306 |
+
pupil_info = np.array(pupil_info)
|
307 |
+
|
308 |
ix, iy, ir = iris_info
|
309 |
px, py, pr = pupil_info
|
310 |
+
|
311 |
# Converter para escala de cinza
|
312 |
gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY)
|
313 |
+
|
314 |
# Equalização adaptativa do histograma
|
315 |
+
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(4, 4))
|
316 |
gray = clahe.apply(gray)
|
317 |
+
|
318 |
# Criar máscara anelar da íris
|
319 |
mask_iris = np.zeros_like(gray)
|
320 |
cv2.circle(mask_iris, (ix, iy), int(ir * 0.98), 255, -1)
|
321 |
cv2.circle(mask_iris, (px, py), int(pr * 1.02), 0, -1)
|
322 |
+
|
323 |
# Dividir em 12 setores
|
324 |
setores = {}
|
325 |
for i in range(12):
|
326 |
ang_inicio = i * 30
|
327 |
ang_fim = (i + 1) * 30
|
328 |
+
|
329 |
# Criar máscara do setor
|
330 |
mask_setor = np.zeros_like(gray)
|
331 |
cv2.ellipse(mask_setor,
|
332 |
+
(ix, iy),
|
333 |
+
(ir, ir),
|
334 |
+
0,
|
335 |
+
ang_inicio,
|
336 |
+
ang_fim,
|
337 |
+
255,
|
338 |
+
-1)
|
339 |
+
|
340 |
# Combinar máscaras
|
341 |
+
kernel = np.ones((2, 2), np.uint8)
|
342 |
mask_final = cv2.bitwise_and(mask_iris, mask_setor)
|
343 |
mask_final = cv2.morphologyEx(mask_final, cv2.MORPH_OPEN, kernel)
|
344 |
+
|
345 |
# Extrair região do setor
|
346 |
setor_roi = cv2.bitwise_and(gray, gray, mask=mask_final)
|
347 |
+
|
348 |
# Análise de textura
|
349 |
non_zero = setor_roi[setor_roi > 0]
|
350 |
if len(non_zero) > 100:
|
351 |
+
# Normalização específica para GLCM
|
352 |
non_zero = ((non_zero - non_zero.min()) /
|
353 |
+
(non_zero.max() - non_zero.min() + 1e-8) * 15).astype(np.uint8)
|
354 |
+
|
355 |
# Reshape para matriz 2D
|
356 |
tamanho_janela = int(np.sqrt(len(non_zero)))
|
357 |
if tamanho_janela > 1:
|
358 |
matriz_2d = non_zero[:tamanho_janela**2].reshape(tamanho_janela, tamanho_janela)
|
359 |
+
|
360 |
try:
|
361 |
# GLCM com 16 níveis
|
362 |
glcm = graycomatrix(matriz_2d,
|
363 |
+
distances=[1],
|
364 |
+
angles=[0, np.pi/4],
|
365 |
+
levels=16,
|
366 |
+
symmetric=True,
|
367 |
+
normed=True)
|
368 |
|
369 |
# Calcular propriedades
|
370 |
contraste = np.mean(graycoprops(glcm, 'contrast'))
|
371 |
homogeneidade = np.mean(graycoprops(glcm, 'homogeneity'))
|
372 |
+
|
373 |
setores[f"setor_{i+1}"] = {
|
374 |
"contraste": float(contraste),
|
375 |
"homogeneidade": float(homogeneidade),
|
|
|
398 |
"media": 0.0,
|
399 |
"std": 0.0
|
400 |
}
|
|
|
|
|
401 |
|
402 |
+
return setores
|
403 |
+
|
404 |
def avaliar_setores(setores):
|
405 |
"""
|
406 |
Avalia os setores com limiares recalibrados baseados nos dados observados
|