Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -606,41 +606,59 @@ def criar_interface():
|
|
| 606 |
button_primary_background_fill="#2A9D8F",
|
| 607 |
button_primary_background_fill_dark="#264653",
|
| 608 |
)
|
| 609 |
-
|
| 610 |
def processar_imagem(imagem):
|
| 611 |
try:
|
| 612 |
# Pré-processamento
|
| 613 |
imagem_processada = pre_processar_imagem(imagem)
|
| 614 |
-
|
| 615 |
# Detectar esclera
|
| 616 |
mask_esclera = detectar_esclera(imagem_processada)
|
| 617 |
-
|
| 618 |
# Detectar íris e pupila
|
| 619 |
iris_info, pupil_info = detectar_iris_pupila(imagem_processada, mask_esclera)
|
| 620 |
-
|
| 621 |
if iris_info is None or pupil_info is None:
|
| 622 |
return imagem, "Não foi possível detectar íris ou pupila corretamente."
|
| 623 |
-
|
| 624 |
# Análise de textura
|
| 625 |
analise_setorial = analisar_textura_setorial(imagem_processada, iris_info, pupil_info)
|
| 626 |
-
|
| 627 |
# Análise do collarette
|
| 628 |
info_collarette = analisar_collarette(imagem_processada, iris_info, pupil_info)
|
| 629 |
-
|
| 630 |
# Criar visualização
|
| 631 |
output_img = imagem.copy()
|
| 632 |
ix, iy, ir = iris_info
|
| 633 |
px, py, pr = pupil_info
|
| 634 |
-
|
| 635 |
-
#
|
| 636 |
-
|
| 637 |
-
cv2.
|
| 638 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 639 |
# Preparar métricas para análise NLP
|
| 640 |
metricas = {
|
| 641 |
'pupila': {
|
| 642 |
'raio': pr,
|
| 643 |
-
'circularidade': avaliar_circularidade(
|
| 644 |
},
|
| 645 |
'iris': {
|
| 646 |
'densidade_media': np.mean([dados['contraste'] for dados in analise_setorial.values()]),
|
|
@@ -648,68 +666,27 @@ def criar_interface():
|
|
| 648 |
},
|
| 649 |
'collarette': info_collarette
|
| 650 |
}
|
| 651 |
-
|
| 652 |
-
#
|
| 653 |
metricas = validar_metricas(metricas)
|
| 654 |
interpretacao_nlp = integrar_analise_nlp(metricas)
|
| 655 |
-
|
| 656 |
-
# Desenhar esclera
|
| 657 |
-
contours, _ = cv2.findContours(mask_esclera, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
| 658 |
-
cv2.drawContours(output_img, contours, -1, (255, 255, 0), 1)
|
| 659 |
-
|
| 660 |
-
# Desenhar íris
|
| 661 |
-
cv2.circle(output_img, (ix, iy), ir, (0, 255, 0), 2)
|
| 662 |
-
|
| 663 |
-
# Desenhar pupila
|
| 664 |
-
cv2.circle(output_img, (px, py), pr, (255, 0, 0), 2)
|
| 665 |
-
|
| 666 |
-
# Desenhar setores
|
| 667 |
-
for i in range(12):
|
| 668 |
-
ang = i * 30
|
| 669 |
-
rad = np.radians(ang)
|
| 670 |
-
end_x = int(ix + ir * np.cos(rad))
|
| 671 |
-
end_y = int(iy + ir * np.sin(rad))
|
| 672 |
-
cv2.line(output_img, (ix, iy), (end_x, end_y), (0, 255, 0), 1)
|
| 673 |
-
|
| 674 |
# Gerar relatório
|
| 675 |
relatorio = "ANÁLISE IRIDOLÓGICA DETALHADA\n\n"
|
| 676 |
-
|
| 677 |
-
# Informações estruturais
|
| 678 |
relatorio += "1. MEDIDAS ESTRUTURAIS\n"
|
| 679 |
relatorio += f"Pupila: Centro ({px}, {py}), Raio {pr}px\n"
|
| 680 |
relatorio += f"Íris: Centro ({ix}, {iy}), Raio {ir}px\n"
|
| 681 |
-
|
| 682 |
-
#
|
| 683 |
-
relatorio += "
|
| 684 |
for setor, dados in analise_setorial.items():
|
| 685 |
-
relatorio += f"
|
| 686 |
-
|
| 687 |
-
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
if dados['contraste'] > 2.0:
|
| 691 |
-
relatorio += " * Alta densidade de sinais\n"
|
| 692 |
-
if dados['homogeneidade'] < 0.5:
|
| 693 |
-
relatorio += " * Possível área de alteração\n"
|
| 694 |
-
|
| 695 |
-
# Análise do collarette
|
| 696 |
-
if info_collarette:
|
| 697 |
-
relatorio += "\n3. ANÁLISE DO COLLARETTE\n"
|
| 698 |
-
relatorio += f"- Regularidade: {info_collarette['regularidade']:.2f}\n"
|
| 699 |
-
relatorio += f"- Circularidade: {info_collarette['circularidade']:.2f}\n"
|
| 700 |
-
|
| 701 |
-
# Interpretação
|
| 702 |
-
if info_collarette['regularidade'] > 500:
|
| 703 |
-
relatorio += " * Irregularidade significativa\n"
|
| 704 |
-
if info_collarette['circularidade'] < 0.8:
|
| 705 |
-
relatorio += " * Possível deformação estrutural\n"
|
| 706 |
-
|
| 707 |
-
# Adicionar interpretação NLP
|
| 708 |
-
relatorio += "\n4. INTERPRETAÇÃO EM LINGUAGEM NATURAL\n"
|
| 709 |
-
relatorio += interpretacao_nlp
|
| 710 |
-
|
| 711 |
return output_img, relatorio
|
| 712 |
-
|
| 713 |
except Exception as e:
|
| 714 |
return imagem, f"Erro durante o processamento: {str(e)}"
|
| 715 |
|
|
|
|
| 606 |
button_primary_background_fill="#2A9D8F",
|
| 607 |
button_primary_background_fill_dark="#264653",
|
| 608 |
)
|
| 609 |
+
|
| 610 |
def processar_imagem(imagem):
|
| 611 |
try:
|
| 612 |
# Pré-processamento
|
| 613 |
imagem_processada = pre_processar_imagem(imagem)
|
| 614 |
+
|
| 615 |
# Detectar esclera
|
| 616 |
mask_esclera = detectar_esclera(imagem_processada)
|
| 617 |
+
|
| 618 |
# Detectar íris e pupila
|
| 619 |
iris_info, pupil_info = detectar_iris_pupila(imagem_processada, mask_esclera)
|
| 620 |
+
|
| 621 |
if iris_info is None or pupil_info is None:
|
| 622 |
return imagem, "Não foi possível detectar íris ou pupila corretamente."
|
| 623 |
+
|
| 624 |
# Análise de textura
|
| 625 |
analise_setorial = analisar_textura_setorial(imagem_processada, iris_info, pupil_info)
|
| 626 |
+
|
| 627 |
# Análise do collarette
|
| 628 |
info_collarette = analisar_collarette(imagem_processada, iris_info, pupil_info)
|
| 629 |
+
|
| 630 |
# Criar visualização
|
| 631 |
output_img = imagem.copy()
|
| 632 |
ix, iy, ir = iris_info
|
| 633 |
px, py, pr = pupil_info
|
| 634 |
+
|
| 635 |
+
# Desenhar esclera
|
| 636 |
+
contours, _ = cv2.findContours(mask_esclera, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
| 637 |
+
cv2.drawContours(output_img, contours, -1, (255, 255, 0), 1) # Esclera em amarelo
|
| 638 |
+
|
| 639 |
+
# Desenhar íris
|
| 640 |
+
cv2.circle(output_img, (ix, iy), ir, (0, 255, 0), 2) # Íris em verde
|
| 641 |
+
|
| 642 |
+
# Desenhar pupila
|
| 643 |
+
cv2.circle(output_img, (px, py), pr, (255, 0, 0), 2) # Pupila em vermelho
|
| 644 |
+
|
| 645 |
+
# Desenhar setores
|
| 646 |
+
for i in range(12):
|
| 647 |
+
ang = i * 30
|
| 648 |
+
rad = np.radians(ang)
|
| 649 |
+
end_x = int(ix + ir * np.cos(rad))
|
| 650 |
+
end_y = int(iy + ir * np.sin(rad))
|
| 651 |
+
cv2.line(output_img, (ix, iy), (end_x, end_y), (255, 255, 255), 1) # Linhas brancas para setores
|
| 652 |
+
|
| 653 |
+
# Adicionando feedback visual
|
| 654 |
+
if info_collarette:
|
| 655 |
+
cv2.putText(output_img, "Collarette Detected", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
|
| 656 |
+
|
| 657 |
# Preparar métricas para análise NLP
|
| 658 |
metricas = {
|
| 659 |
'pupila': {
|
| 660 |
'raio': pr,
|
| 661 |
+
'circularidade': avaliar_circularidade(pupil_info)
|
| 662 |
},
|
| 663 |
'iris': {
|
| 664 |
'densidade_media': np.mean([dados['contraste'] for dados in analise_setorial.values()]),
|
|
|
|
| 666 |
},
|
| 667 |
'collarette': info_collarette
|
| 668 |
}
|
| 669 |
+
|
| 670 |
+
# Validar métricas
|
| 671 |
metricas = validar_metricas(metricas)
|
| 672 |
interpretacao_nlp = integrar_analise_nlp(metricas)
|
| 673 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 674 |
# Gerar relatório
|
| 675 |
relatorio = "ANÁLISE IRIDOLÓGICA DETALHADA\n\n"
|
|
|
|
|
|
|
| 676 |
relatorio += "1. MEDIDAS ESTRUTURAIS\n"
|
| 677 |
relatorio += f"Pupila: Centro ({px}, {py}), Raio {pr}px\n"
|
| 678 |
relatorio += f"Íris: Centro ({ix}, {iy}), Raio {ir}px\n"
|
| 679 |
+
|
| 680 |
+
# Adicionar análise setorial e do collarette
|
| 681 |
+
relatorio += "2. ANÁLISE SETORIAL\n"
|
| 682 |
for setor, dados in analise_setorial.items():
|
| 683 |
+
relatorio += f"Setor {setor}: Contraste {dados['contraste']}, Homogeneidade {dados['homogeneidade']}\n"
|
| 684 |
+
|
| 685 |
+
relatorio += f"3. COLLARETTE: {info_collarette}\n"
|
| 686 |
+
relatorio += f"4. INTERPRETAÇÃO NLP: {interpretacao_nlp}\n"
|
| 687 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 688 |
return output_img, relatorio
|
| 689 |
+
|
| 690 |
except Exception as e:
|
| 691 |
return imagem, f"Erro durante o processamento: {str(e)}"
|
| 692 |
|