Я помогаю ветеринарной клинике измерять давление под собачьей лапой. Я использую Python для анализа данных, и теперь я застреваю, пытаясь разделить лапы на (анатомические) субрегионы.
Я сделал 2D-массив каждой лапы, который состоит из максимальных значений для каждого датчика, который был загружен лапой со временем. Вот пример одной лапы, где я использовал Excel для рисования областей, которые я хочу "обнаружить". Это 2 на 2 ячейки вокруг датчика с локальными максимумами, которые вместе имеют наибольшую сумму.
Итак, я попробовал несколько экспериментов и решил просто искать максимальные значения для каждого столбца и строки (не может выглядеть в одном направлении из-за формы лапы). Это, по-видимому, "обнаруживает" расположение отдельных пальцев ноги довольно хорошо, но также отмечает соседние датчики.
Итак, что было бы лучшим способом сказать Python, какие из этих максимальных значений я хочу?
Также я взял 2x2 в качестве удобства, любое более продвинутое решение приветствуется, но я просто научный сотрудник по человеческому движению, поэтому я не настоящий программист или математик, поэтому, пожалуйста, держите его "простым".
Итак, я попробовал решение @jextee (см. результаты ниже). Как вы можете видеть, он очень хорошо работает на передних лапах, но он работает менее хорошо для задних ног.
Более конкретно, он не может распознать маленький пик, который имеет четвертый палец. Это, очевидно, связано с тем, что петля смотрит сверху вниз на самое низкое значение, не принимая во внимание, где это.
Кто-нибудь знает, как настроить алгоритм @jextee, чтобы он мог также найти 4-й носок?
Поскольку я еще не обработал никаких других испытаний, я не могу предоставить какие-либо другие образцы. Но данные, которые я дал раньше, были средними для каждой лапы. Этот файл представляет собой массив с максимальными данными из 9 лапок в том порядке, в котором они соприкасались с пластиной.
Это изображение показывает, как они были пространственно распределены по пластине.
Вот хороший пример того, где он идет не так: гвоздь распознается как палец, а "пятка" настолько широк, что он распознается дважды!
Лапа слишком большая, поэтому с размером 2x2 без перекрытия несколько признаков обнаружения пальцев. Другое дело, у маленьких собак часто не удается найти пятый палец, который, как я подозреваю, вызван слишком большой площадью 2x2.
Поэтому я должен изменить его. Моя собственная догадка меняла размер neighborhood
на меньшее, чем у маленьких собак, и больше для больших собак. Но generate_binary_structure
не позволит мне изменить размер массива.
Поэтому я надеюсь, что у кого-то еще есть лучшее предложение для определения пальцев ног, возможно, с областью области пальца с размером лапы?
Ответ 8
спасибо за необработанные данные. Я нахожусь в поезде, и это насколько я получил (моя остановка подходит). Я массировал ваш txt файл с помощью регулярных выражений и наложил его на html-страницу с некоторым javascript для визуализации. Я делюсь этим, потому что некоторые, как и я, могут найти его более легко взломанным, чем python.
Я думаю, что хороший подход будет масштабным и поворотным инвариантом, и моим следующим шагом будет исследование смесей гауссонов. (каждая лапка - центр гауссова).
<html>
<head>
<script type="text/javascript" src="http://vis.stanford.edu/protovis/protovis-r3.2.js"></script>
<script type="text/javascript">
var heatmap = [[[0,0,0,0,0,0,0,4,4,0,0,0,0],
[0,0,0,0,0,7,14,22,18,7,0,0,0],
[0,0,0,0,11,40,65,43,18,7,0,0,0],
[0,0,0,0,14,61,72,32,7,4,11,14,4],
[0,7,14,11,7,22,25,11,4,14,65,72,14],
[4,29,79,54,14,7,4,11,18,29,79,83,18],
[0,18,54,32,18,43,36,29,61,76,25,18,4],
[0,4,7,7,25,90,79,36,79,90,22,0,0],
[0,0,0,0,11,47,40,14,29,36,7,0,0],
[0,0,0,0,4,7,7,4,4,4,0,0,0]
],[
[0,0,0,4,4,0,0,0,0,0,0,0,0],
[0,0,11,18,18,7,0,0,0,0,0,0,0],
[0,4,29,47,29,7,0,4,4,0,0,0,0],
[0,0,11,29,29,7,7,22,25,7,0,0,0],
[0,0,0,4,4,4,14,61,83,22,0,0,0],
[4,7,4,4,4,4,14,32,25,7,0,0,0],
[4,11,7,14,25,25,47,79,32,4,0,0,0],
[0,4,4,22,58,40,29,86,36,4,0,0,0],
[0,0,0,7,18,14,7,18,7,0,0,0,0],
[0,0,0,0,4,4,0,0,0,0,0,0,0],
],[
[0,0,0,4,11,11,7,4,0,0,0,0,0],
[0,0,0,4,22,36,32,22,11,4,0,0,0],
[4,11,7,4,11,29,54,50,22,4,0,0,0],
[11,58,43,11,4,11,25,22,11,11,18,7,0],
[11,50,43,18,11,4,4,7,18,61,86,29,4],
[0,11,18,54,58,25,32,50,32,47,54,14,0],
[0,0,14,72,76,40,86,101,32,11,7,4,0],
[0,0,4,22,22,18,47,65,18,0,0,0,0],
[0,0,0,0,4,4,7,11,4,0,0,0,0],
],[
[0,0,0,0,4,4,4,0,0,0,0,0,0],
[0,0,0,4,14,14,18,7,0,0,0,0,0],
[0,0,0,4,14,40,54,22,4,0,0,0,0],
[0,7,11,4,11,32,36,11,0,0,0,0,0],
[4,29,36,11,4,7,7,4,4,0,0,0,0],
[4,25,32,18,7,4,4,4,14,7,0,0,0],
[0,7,36,58,29,14,22,14,18,11,0,0,0],
[0,11,50,68,32,40,61,18,4,4,0,0,0],
[0,4,11,18,18,43,32,7,0,0,0,0,0],
[0,0,0,0,4,7,4,0,0,0,0,0,0],
],[
[0,0,0,0,0,0,4,7,4,0,0,0,0],
[0,0,0,0,4,18,25,32,25,7,0,0,0],
[0,0,0,4,18,65,68,29,11,0,0,0,0],
[0,4,4,4,18,65,54,18,4,7,14,11,0],
[4,22,36,14,4,14,11,7,7,29,79,47,7],
[7,54,76,36,18,14,11,36,40,32,72,36,4],
[4,11,18,18,61,79,36,54,97,40,14,7,0],
[0,0,0,11,58,101,40,47,108,50,7,0,0],
[0,0,0,4,11,25,7,11,22,11,0,0,0],
[0,0,0,0,0,4,0,0,0,0,0,0,0],
],[
[0,0,4,7,4,0,0,0,0,0,0,0,0],
[0,0,11,22,14,4,0,4,0,0,0,0,0],
[0,0,7,18,14,4,4,14,18,4,0,0,0],
[0,4,0,4,4,0,4,32,54,18,0,0,0],
[4,11,7,4,7,7,18,29,22,4,0,0,0],
[7,18,7,22,40,25,50,76,25,4,0,0,0],
[0,4,4,22,61,32,25,54,18,0,0,0,0],
[0,0,0,4,11,7,4,11,4,0,0,0,0],
],[
[0,0,0,0,7,14,11,4,0,0,0,0,0],
[0,0,0,4,18,43,50,32,14,4,0,0,0],
[0,4,11,4,7,29,61,65,43,11,0,0,0],
[4,18,54,25,7,11,32,40,25,7,11,4,0],
[4,36,86,40,11,7,7,7,7,25,58,25,4],
[0,7,18,25,65,40,18,25,22,22,47,18,0],
[0,0,4,32,79,47,43,86,54,11,7,4,0],
[0,0,0,14,32,14,25,61,40,7,0,0,0],
[0,0,0,0,4,4,4,11,7,0,0,0,0],
],[
[0,0,0,0,4,7,11,4,0,0,0,0,0],
[0,4,4,0,4,11,18,11,0,0,0,0,0],
[4,11,11,4,0,4,4,4,0,0,0,0,0],
[4,18,14,7,4,0,0,4,7,7,0,0,0],
[0,7,18,29,14,11,11,7,18,18,4,0,0],
[0,11,43,50,29,43,40,11,4,4,0,0,0],
[0,4,18,25,22,54,40,7,0,0,0,0,0],
[0,0,4,4,4,11,7,0,0,0,0,0,0],
],[
[0,0,0,0,0,7,7,7,7,0,0,0,0],
[0,0,0,0,7,32,32,18,4,0,0,0,0],
[0,0,0,0,11,54,40,14,4,4,22,11,0],
[0,7,14,11,4,14,11,4,4,25,94,50,7],
[4,25,65,43,11,7,4,7,22,25,54,36,7],
[0,7,25,22,29,58,32,25,72,61,14,7,0],
[0,0,4,4,40,115,68,29,83,72,11,0,0],
[0,0,0,0,11,29,18,7,18,14,4,0,0],
[0,0,0,0,0,4,0,0,0,0,0,0,0],
]
];
</script>
</head>
<body>
<script type="text/javascript+protovis">
for (var a=0; a < heatmap.length; a++) {
var w = heatmap[a][0].length,
h = heatmap[a].length;
var vis = new pv.Panel()
.width(w * 6)
.height(h * 6)
.strokeStyle("#aaa")
.lineWidth(4)
.antialias(true);
vis.add(pv.Image)
.imageWidth(w)
.imageHeight(h)
.image(pv.Scale.linear()
.domain(0, 99, 100)
.range("#000", "#fff", '#ff0a0a')
.by(function(i, j) heatmap[a][j][i]));
vis.render();
}
</script>
</body>
</html>