Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -294,7 +294,7 @@ def detectar_iris_pupila(imagem, mask_esclera):
|
|
294 |
|
295 |
def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
296 |
"""
|
297 |
-
Analisa a textura da íris por setores com
|
298 |
"""
|
299 |
if iris_info is None or pupil_info is None:
|
300 |
return {}
|
@@ -302,17 +302,17 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
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 = {}
|
@@ -331,7 +331,7 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
331 |
255,
|
332 |
-1)
|
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)
|
@@ -339,69 +339,84 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
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
|
346 |
non_zero = ((non_zero - non_zero.min()) /
|
347 |
-
(non_zero.max() - non_zero.min() + 1e-8) *
|
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 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
"
|
368 |
-
|
369 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
370 |
else:
|
371 |
setores[f"setor_{i+1}"] = {
|
372 |
"contraste": 0.0,
|
373 |
-
"homogeneidade": 1.0
|
|
|
|
|
374 |
}
|
375 |
else:
|
376 |
setores[f"setor_{i+1}"] = {
|
377 |
"contraste": 0.0,
|
378 |
-
"homogeneidade": 1.0
|
|
|
|
|
379 |
}
|
380 |
|
381 |
return setores
|
382 |
|
383 |
def avaliar_setores(setores):
|
384 |
"""
|
385 |
-
Avalia os setores com novos
|
386 |
"""
|
387 |
for setor, dados in setores.items():
|
388 |
mensagens = []
|
389 |
|
390 |
-
#
|
391 |
-
if dados['contraste'] >
|
392 |
mensagens.append("Alta densidade de sinais")
|
393 |
-
elif dados['contraste'] <
|
394 |
mensagens.append("Baixa densidade de sinais")
|
395 |
|
396 |
-
if dados['homogeneidade'] < 0.3:
|
397 |
mensagens.append("Possível área de alteração")
|
398 |
-
elif dados['homogeneidade'] > 0.8:
|
399 |
mensagens.append("Área homogênea e saudável")
|
400 |
|
401 |
dados['interpretacao'] = mensagens
|
402 |
|
403 |
return setores
|
404 |
-
|
405 |
def analisar_collarette(imagem, iris_info, pupil_info):
|
406 |
"""
|
407 |
Analisa o collarette (anel de contração) em detalhes
|
|
|
294 |
|
295 |
def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
296 |
"""
|
297 |
+
Analisa a textura da íris por setores com correção dos níveis de cinza
|
298 |
"""
|
299 |
if iris_info is None or pupil_info is None:
|
300 |
return {}
|
|
|
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 = {}
|
|
|
331 |
255,
|
332 |
-1)
|
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)
|
|
|
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 (importante: valores entre 0 e 15)
|
346 |
non_zero = ((non_zero - non_zero.min()) /
|
347 |
+
(non_zero.max() - non_zero.min() + 1e-8) * 15).astype(np.uint8)
|
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 |
+
distances=[1],
|
358 |
+
angles=[0, np.pi/4],
|
359 |
+
levels=16, # Deve ser maior que o máximo valor na imagem (15)
|
360 |
+
symmetric=True,
|
361 |
+
normed=True)
|
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),
|
370 |
+
"media": float(np.mean(non_zero)),
|
371 |
+
"std": float(np.std(non_zero))
|
372 |
+
}
|
373 |
+
except Exception as e:
|
374 |
+
print(f"Erro no GLCM do setor {i+1}: {str(e)}")
|
375 |
+
setores[f"setor_{i+1}"] = {
|
376 |
+
"contraste": 0.0,
|
377 |
+
"homogeneidade": 1.0,
|
378 |
+
"media": 0.0,
|
379 |
+
"std": 0.0
|
380 |
+
}
|
381 |
else:
|
382 |
setores[f"setor_{i+1}"] = {
|
383 |
"contraste": 0.0,
|
384 |
+
"homogeneidade": 1.0,
|
385 |
+
"media": 0.0,
|
386 |
+
"std": 0.0
|
387 |
}
|
388 |
else:
|
389 |
setores[f"setor_{i+1}"] = {
|
390 |
"contraste": 0.0,
|
391 |
+
"homogeneidade": 1.0,
|
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 ajustados para os novos valores
|
401 |
"""
|
402 |
for setor, dados in setores.items():
|
403 |
mensagens = []
|
404 |
|
405 |
+
# Limiares ajustados para os novos valores de contraste
|
406 |
+
if dados['contraste'] > 5:
|
407 |
mensagens.append("Alta densidade de sinais")
|
408 |
+
elif dados['contraste'] < 1:
|
409 |
mensagens.append("Baixa densidade de sinais")
|
410 |
|
411 |
+
if dados['homogeneidade'] < 0.3:
|
412 |
mensagens.append("Possível área de alteração")
|
413 |
+
elif dados['homogeneidade'] > 0.8:
|
414 |
mensagens.append("Área homogênea e saudável")
|
415 |
|
416 |
dados['interpretacao'] = mensagens
|
417 |
|
418 |
return setores
|
419 |
+
|
420 |
def analisar_collarette(imagem, iris_info, pupil_info):
|
421 |
"""
|
422 |
Analisa o collarette (anel de contração) em detalhes
|