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 {}
|
@@ -305,14 +305,14 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
305 |
# Converter para escala de cinza com preservação de contraste
|
306 |
gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY)
|
307 |
|
308 |
-
# Equalização adaptativa do histograma
|
309 |
-
clahe = cv2.createCLAHE(clipLimit=
|
310 |
gray = clahe.apply(gray)
|
311 |
|
312 |
-
# Criar máscara anelar da íris com
|
313 |
mask_iris = np.zeros_like(gray)
|
314 |
-
cv2.circle(mask_iris, (ix, iy), int(ir * 0.
|
315 |
-
cv2.circle(mask_iris, (px, py), int(pr * 1.
|
316 |
|
317 |
# Dividir em 12 setores
|
318 |
setores = {}
|
@@ -320,7 +320,7 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
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 |
(ix, iy),
|
@@ -331,75 +331,77 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
|
|
331 |
255,
|
332 |
-1)
|
333 |
|
334 |
-
# Combinar máscaras com operação morfológica
|
335 |
-
kernel = np.ones((
|
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 |
-
#
|
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 |
-
distances = [1
|
356 |
-
angles = [0, np.pi/4
|
357 |
glcm = graycomatrix(matriz_2d, distances, angles,
|
358 |
-
|
|
|
|
|
359 |
|
360 |
-
# Calcular propriedades
|
361 |
-
contraste = np.mean(graycoprops(glcm, 'contrast'))
|
362 |
homogeneidade = np.mean(graycoprops(glcm, 'homogeneity'))
|
363 |
-
energia = np.mean(graycoprops(glcm, 'energy'))
|
364 |
-
correlacao = np.mean(graycoprops(glcm, 'correlation'))
|
365 |
-
|
366 |
-
# Análise de gradiente
|
367 |
-
sobelx = cv2.Sobel(matriz_2d, cv2.CV_64F, 1, 0, ksize=3)
|
368 |
-
sobely = cv2.Sobel(matriz_2d, cv2.CV_64F, 0, 1, ksize=3)
|
369 |
-
gradiente = np.mean(np.sqrt(sobelx**2 + sobely**2))
|
370 |
|
371 |
setores[f"setor_{i+1}"] = {
|
372 |
-
"media": np.mean(non_zero),
|
373 |
-
"std": np.std(non_zero),
|
374 |
"contraste": float(contraste),
|
375 |
-
"homogeneidade": float(homogeneidade)
|
376 |
-
"energia": float(energia),
|
377 |
-
"correlacao": float(correlacao),
|
378 |
-
"gradiente": float(gradiente)
|
379 |
}
|
380 |
else:
|
381 |
setores[f"setor_{i+1}"] = {
|
382 |
-
"media": np.mean(non_zero),
|
383 |
-
"std": np.std(non_zero),
|
384 |
"contraste": 0.0,
|
385 |
-
"homogeneidade": 1.0
|
386 |
-
"energia": 1.0,
|
387 |
-
"correlacao": 0.0,
|
388 |
-
"gradiente": 0.0
|
389 |
}
|
390 |
else:
|
391 |
setores[f"setor_{i+1}"] = {
|
392 |
-
"media": 0.0,
|
393 |
-
"std": 0.0,
|
394 |
"contraste": 0.0,
|
395 |
-
"homogeneidade": 1.0
|
396 |
-
"energia": 1.0,
|
397 |
-
"correlacao": 0.0,
|
398 |
-
"gradiente": 0.0
|
399 |
}
|
400 |
|
401 |
return setores
|
402 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
403 |
def analisar_collarette(imagem, iris_info, pupil_info):
|
404 |
"""
|
405 |
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 calibração melhorada
|
298 |
"""
|
299 |
if iris_info is None or pupil_info is None:
|
300 |
return {}
|
|
|
305 |
# Converter para escala de cinza com preservação de contraste
|
306 |
gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY)
|
307 |
|
308 |
+
# Equalização adaptativa do histograma com parâmetros ajustados
|
309 |
+
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(4,4))
|
310 |
gray = clahe.apply(gray)
|
311 |
|
312 |
+
# Criar máscara anelar da íris com margens ajustadas
|
313 |
mask_iris = np.zeros_like(gray)
|
314 |
+
cv2.circle(mask_iris, (ix, iy), int(ir * 0.98), 255, -1) # Margem externa menor
|
315 |
+
cv2.circle(mask_iris, (px, py), int(pr * 1.02), 0, -1) # Margem interna menor
|
316 |
|
317 |
# Dividir em 12 setores
|
318 |
setores = {}
|
|
|
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 |
(ix, iy),
|
|
|
331 |
255,
|
332 |
-1)
|
333 |
|
334 |
+
# Combinar máscaras com operação morfológica suave
|
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 calibrada
|
343 |
non_zero = setor_roi[setor_roi > 0]
|
344 |
+
if len(non_zero) > 100:
|
345 |
+
# Normalização com range reduzido
|
346 |
non_zero = ((non_zero - non_zero.min()) /
|
347 |
+
(non_zero.max() - non_zero.min() + 1e-8) * 100).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 |
+
# GLCM com parâmetros calibrados
|
355 |
+
distances = [1] # Reduzir para apenas distância 1
|
356 |
+
angles = [0, np.pi/4] # Reduzir número de ângulos
|
357 |
glcm = graycomatrix(matriz_2d, distances, angles,
|
358 |
+
levels=32, # Reduzir níveis
|
359 |
+
symmetric=True,
|
360 |
+
normed=True)
|
361 |
|
362 |
+
# Calcular propriedades com normalização
|
363 |
+
contraste = np.mean(graycoprops(glcm, 'contrast')) / 10 # Normalizar contraste
|
364 |
homogeneidade = np.mean(graycoprops(glcm, 'homogeneity'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
365 |
|
366 |
setores[f"setor_{i+1}"] = {
|
|
|
|
|
367 |
"contraste": float(contraste),
|
368 |
+
"homogeneidade": float(homogeneidade)
|
|
|
|
|
|
|
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 limiares calibrados
|
386 |
+
"""
|
387 |
+
for setor, dados in setores.items():
|
388 |
+
mensagens = []
|
389 |
+
|
390 |
+
# Novos limiares calibrados
|
391 |
+
if dados['contraste'] > 50: # Ajustado de 2.0
|
392 |
+
mensagens.append("Alta densidade de sinais")
|
393 |
+
elif dados['contraste'] < 10: # Novo limiar
|
394 |
+
mensagens.append("Baixa densidade de sinais")
|
395 |
+
|
396 |
+
if dados['homogeneidade'] < 0.3: # Ajustado de 0.5
|
397 |
+
mensagens.append("Possível área de alteração")
|
398 |
+
elif dados['homogeneidade'] > 0.8: # Novo limiar
|
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
|