Eu tenho um conjunto de imagens que representam a curvatura média de uma superfície traseira humana.
O que eu quero fazer é "escanear" a imagem em busca de pontos que tenham "contrapartes" semelhantes e refletidas em alguma outra parte da imagem (provavelmente simétrica à linha média, mas não necessariamente, pois pode haver deformidades). Algumas técnicas de costura de imagens usam isso para "detectar automaticamente" pontos semelhantes entre as imagens, mas eu quero detectá-los nos dois lados da mesma imagem.
O objetivo final é encontrar uma linha longitudinal contínua, provavelmente curva, que divida adaptativamente as costas em "metades" simétricas.
Uma imagem de amostra é colocada abaixo. Observe que nem todas as regiões são simétricas (especificamente, logo acima do centro da imagem, a "faixa" vertical vermelha desvia para a direita). Essa região deve receber uma pontuação ruim, ou o que seja, mas a simetria local seria definida a partir de pontos simétricos colocados mais distantes. De qualquer forma, terei que adaptar qualquer algoritmo ao meu domínio de aplicativo, mas o que estou procurando é uma estratégia de correlação / convolução / correspondência de padrões, acho que já deve haver algo por aí.
(EDIT: existem mais imagens abaixo e mais algumas explicações)
EDIT: conforme solicitado, incluirei imagens mais típicas, bem comportadas e problemáticas. Porém, em vez de imagens mapeadas em cores, elas são em escala de cinza, de modo que a cor se relaciona diretamente à magnitude dos dados, o que não aconteceu com a imagem colorida (fornecida apenas para comunicação). Embora as imagens em cinza pareçam não ter contraste em comparação com as coloridas, os gradientes de dados estão lá e podem ser trazidos com algum contraste adaptável, se desejado.
1) Imagem de um assunto muito simétrico:
2) Imagem do mesmo assunto em um momento diferente. Embora existam mais "recursos" (mais gradientes), ele não "parece" tão simétrico como antes:
3) Um sujeito jovem e magro, com convexidades (saliências ósseas, denotadas por regiões mais claras) na linha média em vez da linha côncava mais comum:
4) Um jovem com desvio da coluna vertebral confirmado por raios X (observe as assimetrias):
5) O assunto "inclinado" típico (embora principalmente simétrico em torno da linha média curvada e, como tal, não esteja "deformado" adequadamente):
Qualquer ajuda é muito bem-vinda!
fonte
Respostas:
Como eu disse nos comentários, o registro de imagens médicas é um tópico com muitas pesquisas disponíveis, e eu não sou especialista. Pelo que li, a idéia básica comumente usada é definir um mapeamento entre duas imagens (no seu caso, uma imagem e sua imagem espelhada), depois definir termos de energia para suavidade e semelhança de imagem se o mapeamento for aplicado e, finalmente, otimize esse mapeamento usando técnicas de otimização padrão (ou às vezes específicas de aplicativos).
Eu criei um algoritmo rápido no Mathematica para demonstrar isso. Este não é um algoritmo que você deve usar em um aplicativo médico, apenas uma demonstração das idéias básicas.
Primeiro, carrego sua imagem, espelho e divido essas imagens em pequenos blocos:
Normalmente, faríamos um registro rígido aproximado (usando, por exemplo, pontos-chave ou momentos de imagem), mas sua imagem está quase centralizada, então eu vou pular isso.
Se olharmos para um bloco e sua contrapartida de imagem espelhada:
Podemos ver que eles são semelhantes, mas mudaram. A quantidade e a direção da mudança é o que estamos tentando descobrir.
Para quantificar a similaridade da correspondência, posso usar a distância euclidiana ao quadrado:
infelizmente, usar esses dados é a otimização diretamente mais difícil do que eu pensava, então usei uma aproximação de segunda ordem:
A função não é a mesma que a função de correlação real, mas está próxima o suficiente para um primeiro passo. Vamos calcular isso para cada par de blocos:
Isso nos dá nosso primeiro termo energético para a otimização:
variablesX/Y
contém as compensações para cada bloco ematchEnergyFit
aproxima a diferença euclidiana ao quadrado entre a imagem original e a imagem espelhada com as compensações aplicadas.A otimização dessa energia por si só daria resultados ruins (se é que convergiam). Também queremos que as compensações sejam suaves, onde a similaridade do bloco não diz nada sobre a compensação (por exemplo, ao longo de uma linha reta ou no fundo branco).
Então, configuramos um segundo termo de energia para suavidade:
Felizmente, a otimização restrita está integrada no Mathematica:
Vejamos o resultado:
O
0.1
fator anteriorsmoothnessEnergy
é o peso relativo que a energia da suavidade recebe em relação ao termo de energia da correspondência de imagem. Estes são resultados para pesos diferentes:Possíveis melhorias:
fonte
Pergunta interessante. Primeiro, talvez você esteja buscando abordagens com base no detector de ponto-chave de interesse e na correspondência. Isso incluiria SIFT (Transform-Invariant Feature Transform), SURF, ORB, etc ... ou até mesmo uma abordagem mais simples baseada exclusivamente no operador Harris (csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf ) Não está claro em sua postagem o que você tentou, então, desculpe se estou sendo ingênuo aqui.
Dito isso, deixe-me adotar uma abordagem mais simples com a Morfologia matemática (MM) apenas por diversão :) As imagens para visualização de todas as etapas estão no final.
Peguei sua imagem de amostra e a converti para o espaço de cores L a b * usando o ImageMagick e usei apenas a banda L *:
0.png corresponde à banda L *. Agora, tenho certeza de que você tem os dados reais da imagem, mas estou lidando com artefatos de compactação jpg e o que não. Para lidar parcialmente com esse problema, realizei uma abertura morfológica seguida de um fechamento morfológico com um disco plano de raio 5. Essa é uma maneira básica de reduzir o ruído com MM e, dado que o raio do disco, grande parte da imagem não é alterada. Em seguida, minha ideia foi baseada nessa imagem única, com grandes chances de falhar em outros casos. Sua região de interesse é distinguida visualmente por ser mais escura ("mais quente" na imagem colorida), então eu supunha que um binarizador estatístico pudesse ter um bom desempenho. Eu usei a abordagem do Otsu, que é automática.
Neste ponto, é possível visualizar claramente a região central de interesse. O problema é que, na minha abordagem, eu queria que fosse um componente fechado, mas não é. Começo descartando todos os componentes conectados menores que o maior (sem contar o fundo como um deles). Isso tem mais chance de funcionar em outros casos, se o resultado da binarização for bom. Na imagem de exemplo, há um componente conectado ao plano de fundo, portanto ele não é descartado, mas não causa problemas.
Se você ainda está me seguindo, ainda precisamos encontrar a suposta região central de interesse. Aqui está a minha opinião. Não importa quão curvada a pessoa seja (na verdade, posso ver certos casos problemáticos), a região se assemelha a uma linha vertical. Para esse fim, simplifico a imagem atual executando uma abertura morfológica com uma linha vertical de comprimento 100. Esse comprimento é puramente arbitrário, se você não tiver problemas de dimensionamento, esse valor não será difícil de determinar. Agora, descartamos novamente os componentes, mas tomei um pouco mais de cuidado nesta etapa. Usei a abertura por área com o complemento da imagem para descartar o que considerava pequenas regiões; isso poderia ser feito de maneira mais controlada, realizando algo sob a forma de análise granulométrica (também da MM).
Temos aproximadamente três peças agora: a parte esquerda da imagem, a parte central e a parte direita da imagem. Espera-se que a parte central seja o componente menor dos três, portanto é obtida trivialmente.
Aqui está o resultado final, a imagem inferior direita é apenas a imagem sobreposta à esquerda com a original. Os números individuais não estão todos alinhados, desculpe pela pressa.
fonte