Spaces:
Sleeping
Sleeping
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 |
|