DHEIVER commited on
Commit
0127bb4
·
verified ·
1 Parent(s): 70cfba1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +50 -35
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 calibração melhorada
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 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 = {}
@@ -331,7 +331,7 @@ def analisar_textura_setorial(imagem, iris_info, pupil_info):
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)
@@ -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 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
 
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