
Você recebe uma ressonância magnética cerebral e uma pergunta enganosamente simples: quanta esclerose múltipla existe aqui? As lesões estão bem ali na sequência FLAIR, pequenos pontos brilhantes espalhados pela substância branca, mas “bem ali” não é um número. Contá-las manualmente em 181 fatias, para cinco pacientes, é como desperdiçar um fim de semana inteiro. Este post descreve um pipeline não supervisionado que transforma esses pontos em um único valor: carga lesional em milímetros cúbicos.
TL;DR: Construir um pipeline não supervisionado que segmenta lesões de esclerose múltipla em ressonância magnética cerebral e reporta a carga lesional em milímetros cúbicos.
Stack: Python, SimpleITK, ITK-Elastix, scikit-learn, NumPy
Nível: Avançado
Tempo de leitura: ~6 min
Construí isso para um curso de processamento de imagens 3D, com cinco exames de pacientes, um atlas cerebral probabilístico e um critério de avaliação que atribuía zero absoluto se o notebook gerasse qualquer erro. Sem rótulos de verdade fundamental, sem atalhos. Apenas volumes brutos de T1 e FLAIR e a expectativa de que, ao final, uma planilha com os volumes das lesões fosse gerada.
Elimine o ruído antes de qualquer coisa
A ressonância magnética não chega limpa. O scanner, a respiração do paciente, o calor nas bobinas — tudo isso gera ruído que as etapas seguintes irão confundir com sinal. O problema é um trade-off: filtrar pouco e o ruído persiste, filtrar demais e você apaga as bordas finas que importam para o diagnóstico. Por isso, testei três filtros e usei uma imagem de diferença como árbitro.
O julgamento é simples. Subtraia a imagem filtrada da original e observe o que foi removido:
G = np.abs(arr_original - arr_denoised)
Se G for apenas granulação aleatória, o filtro removeu apenas ruído. Se G mostrar anatomia cerebral nítida, o filtro foi longe demais e deletou estrutura real. O filtro bilateral suavizou de forma muito agressiva. O Non-Local Means parecia ótimo na teoria, mas nunca finalizou em um volume completo em tempo razoável, portanto foi descartado pelo custo computacional. A difusão anisotrópica venceu: ela suaviza intensamente nas regiões planas e praticamente para nas bordas.
Confirmei a escolha visual com SSIM (0,998, estrutura preservada), então a decisão não foi puramente subjetiva.
Alinhe o atlas e o paciente no mesmo espaço
Aqui está o problema central. O atlas probabilístico (mapas que indicam, por voxel, a probabilidade de substância branca, cinzenta ou LCR) vive em um espaço de coordenadas padrão. O cérebro do paciente não: posição diferente, tamanho diferente, forma diferente. Para usar o atlas como guia, é preciso primeiro deformá-lo sobre o paciente — e isso exige registro de imagens.
Esses mapas vivem no espaço MNI, nomeado em homenagem ao Montreal Neurological Institute, que construiu o template fazendo a média de centenas de cérebros saudáveis em uma cabeça canônica. Essa média é exatamente o motivo pelo qual você não pode comparar intensidades diretamente: o brilho do atlas é uma mistura de muitas pessoas, não deste paciente específico.
Portanto, a métrica de similaridade usada é a Informação Mútua, que avalia a consistência estatística entre distribuições de intensidade em vez da diferença direta de pixels. O registro ocorre em duas passagens, do grosseiro ao fino:
# Passagem 1: rígida (translação + rotação)
# Passagem 2: afim (+ escala + cisalhamento)
Qualquer transformação que alinha o T1 do atlas é aplicada de forma idêntica aos mapas de SB, SC e LCR, com interpolação linear para que suas probabilidades de 0 a 1 permaneçam suaves. Para verificar o resultado sem verdade fundamental, usei um tabuleiro de xadrez: intercale blocos das duas imagens e veja se a anatomia flui sem quebras nas costuras. E fluiu.
Encontre os pontos brilhantes na substância branca
A EM é uma doença da substância branca e, na sequência FLAIR, as lesões são hiperintensas — mais brilhantes do que o tecido ao redor. Isso oferece uma estratégia: olhar apenas dentro da substância branca e então procurar o cluster mais brilhante.
O atlas constrói a máscara. Um voxel é considerado substância branca somente se os mapas concordarem fortemente:
mask = (wm > 0.8) & (gm < 0.3) & (csf < 0.2)
As duas condições negativas importam mais do que parecem. Elas excluem voxels próximos ao córtex e aos ventrículos, onde efeitos de volume parcial simulam brilho, e o tecido periventricular é exatamente onde muitas lesões de EM se escondem.
Em seguida, K-Means nas intensidades FLAIR dentro dessa máscara, com K=6. Por que não K=2, lesão versus normal? Porque a substância branca normal já varia em brilho, portanto uma divisão binária empurraria todo voxel levemente brilhante para o grupo de lesão e inflaria a contagem. Com seis clusters, a variação natural se distribui por cinco “buckets” normais e o mais brilhante isola a cauda hiperintensa. Esse cluster, refinado por um limiar de intensidade adaptativo e limpo de pontos menores que 3 voxels, constitui a lesão.
Converta voxels em milímetros
A última etapa é quase anticlimática. Conte os voxels de lesão e multiplique pelo volume de um voxel:
volume_mm3 = np.count_nonzero(lesion_mask) * np.prod(spacing)
Os exames têm espaçamento isotrópico de 1 mm, portanto cada voxel equivale a exatamente um milímetro cúbico e a contagem é o volume. Cinco pacientes, cinco números:
| Imagem | Carga lesional (mm³) |
|---|---|
| T01C01 | 14101 |
| T01C04 | 25474 |
| T03C04 | 6247 |
| T04C03 | 16239 |
| T05C02 | 7927 |
As lesões detectadas se agruparam ao redor dos ventrículos, o padrão periventricular que os critérios de McDonald apontam como típico da EM. Não é uma prova, mas é um sinal tranquilizador de que o pipeline encontrou a doença e não artefatos.
O que você fez
Você pegou volumes brutos de T1 e FLAIR, removeu o ruído com difusão anisotrópica, deformou um atlas probabilístico sobre cada paciente com registro rígido e depois afim, restringiu a busca à substância branca confiável e deixou o K-Means revelar as lesões hiperintensas. Em seguida, contou voxels e obteve um número clínico real — carga lesional em milímetros cúbicos — sem rastreamento manual e sem dados de treinamento rotulados. O fim de semana é seu novamente.
Próximos passos
- Adicione a correção de viés N4: Execute o N4 logo após a filtragem de ruído para equalizar a deriva lenta de intensidade introduzida pelas bobinas. Isso torna o limiar da substância branca muito mais estável entre os pacientes.
- Substitua K-Means por um GMM: Um Modelo de Mistura Gaussiana fornece pertinência probabilística e suave aos clusters, em vez de rótulos rígidos, o que lida melhor com as bordas difusas das lesões.
- Valide com um radiologista: Compare os volumes com as segmentações manuais de especialistas usando um Dice score, transformando “parece correto” em um erro mensurável.
- Experimente o registro deformável: Uma passagem B-spline após a etapa afim fecharia a incompatibilidade cortical que a cascata rígida mais afim deixa para trás.
Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.