Detecção de pico em uma matriz 2D

| | | | | | | | | | | | | | | | | | | | | |

Estou ajudando uma clínica veterinária medindo a pressão sob a pata de um cachorro. Eu uso Python para minha análise de dados e agora estou tentando dividir as patas em sub-regiões (anatômicas).

Eu fiz uma matriz 2D de cada pata, que consiste nos valores máximos para cada sensor que foi carregado pela pata ao longo do tempo. Aqui está um exemplo de uma pata, onde usei o Excel para desenhar as áreas que quero "detectar". São caixas 2 por 2 ao redor do sensor com máximos locais, que juntos têm a maior soma.

alt text

Então eu tentei algumas experiências e decidi simplesmente procurar o máximos de cada coluna e linha (não pode olhar em uma direção devido ao formato da pata). Isso parece "detectar" a localização dos dedos separados muito bem, mas também marca os sensores vizinhos.

alt text

Então, qual seria a melhor maneira de dizer ao Python qual desses os máximos são os que eu quero?

Observação: os quadrados 2x2 não podem se sobrepor, pois eles precisam ser dedos separados!

Também peguei 2x2 por conveniência, qualquer solução mais avançada é bem-vinda, mas eu sou simplesmente um cientista do movimento humano, então não sou um programador de verdade nem um matemático, então, por favor, mantenha-o "simples".

Aqui"sa versão que pode ser carregada com np.loadtxt


Resultados

Então eu tentei a solução @jextee (veja os resultados abaixo). Como você pode ver, funciona muito nas patas dianteiras, mas funciona menos nas patas traseiras.

Mais especificamente, ele não consegue reconhecer o pequeno pico que é o quarto dedo do pé. Isso é obviamente inerente ao fato de o loop olhar de cima para baixo em direção ao valor mais baixo, sem levar em consideração onde ele está.

Alguém saberia como ajustar o algoritmo do @jextee, para que ele possa encontrar o quarto dedo também?

alt text

Como ainda não processei nenhum outro teste, não posso fornecer outras amostras. Mas os dados que dei antes foram as médias de cada pata. Este arquivo é uma matriz com os dados máximos de 9 patas na ordem em que entraram em contato com a placa.

Esta imagem mostra como elas foram espalhadas espacialmente pela placa.

alt text

Atualização:

Criei um blog para qualquer pessoa interessada e Eu configurei um SkyDrive com todas as medidas brutas. Então, para qualquer um solicitando mais dados: mais poder para você!


Nova atualização:

Então, depois da ajuda que recebi com minhas perguntas sobre detecção de pata e classificação de pata, finalmente consegui verificar a detecção de dedo do pé para cada pata! Acontece que não funciona tão bem em nada além de patas do tamanho da do meu próprio exemplo. Claro, em retrospectiva, é minha própria culpa por escolher o 2x2 de forma tão arbitrária.

Aqui" um bom exemplo de onde dá errado: uma unha está sendo reconhecida como um dedo do pé e o "calcanhar" é tão largo que é reconhecido duas vezes!

alt text

A pata é muito grande, então tomar um tamanho 2x2 sem sobreposição faz com que alguns dedos sejam detectados duas vezes. , em cães pequenos, muitas vezes não consegue encontrar um quinto dedo do pé, o que eu suspeito estar sendo causado pela área 2x2 ser muito grande.

Depois de tentando a solução atual em todas as minhas medições cheguei à conclusão surpreendente de que, para quase todos os meus cães pequenos, ele não encontrou um quinto dedo do pé e que em mais de 50% dos impactos para os cães grandes encontraria mais!

Então, claramente, preciso mudá-lo. Meu palpite foi mudar o tamanho do bairro para algo menor para cães pequenos e maior para cães grandes. Mas generate_binary_structure não me deixaria alterar o tamanho da matriz.

Portanto, espero que alguém tenha uma sugestão melhor para localizar os dedos do pé, talvez tendo o dedo do pé escala de área com o tamanho da pata?