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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -45
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 correções e melhorias
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=2.0, tileGridSize=(8,8))
310
  gray = clahe.apply(gray)
311
 
312
- # Criar máscara anelar da íris com margem de segurança
313
  mask_iris = np.zeros_like(gray)
314
- cv2.circle(mask_iris, (ix, iy), int(ir * 0.95), 255, -1) # Reduzir raio em 5%
315
- cv2.circle(mask_iris, (px, py), int(pr * 1.05), 0, -1) # Aumentar raio em 5%
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 com ângulos precisos
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((3,3), 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 melhorada
343
  non_zero = setor_roi[setor_roi > 0]
344
- if len(non_zero) > 100: # Garantir amostra significativa
345
- # Normalizar valores
346
  non_zero = ((non_zero - non_zero.min()) /
347
- (non_zero.max() - non_zero.min() + 1e-8) * 255).astype(np.uint8)
348
 
349
- # Reshape para matriz 2D para GLCM
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
- # Calcular GLCM com múltiplas distâncias e ângulos
355
- distances = [1, 2, 3]
356
- angles = [0, np.pi/4, np.pi/2, 3*np.pi/4]
357
  glcm = graycomatrix(matriz_2d, distances, angles,
358
- symmetric=True, normed=True)
 
 
359
 
360
- # Calcular propriedades médias
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