Как я могу повернуть 3D-массив? - PullRequest
10 голосов
/ 22 января 2011

В настоящее время, если я хочу сравнить давление под каждой лапой собаки, я сравниваю только давление под каждым пальцем ноги. Но я хочу попробовать сравнить давление под всей лапой.

Но для этого мне нужно повернуть их, чтобы пальцы ног перекрывались (лучше). Потому что в большинстве случаев левая и правая лапы слегка повернуты наружу, так что если вы не можете просто проецировать одну поверх другой. Поэтому я хочу повернуть лапы, чтобы все они были выровнены одинаково.

alt text

В настоящее время я вычисляю угол поворота, просматривая два средних пальца и задний , используя обнаружение пальца , затем вычисляю угол между желтой линией (ось между пальцем зеленого и красного цвета). ) и зеленая линия (нейтральная ось).

Теперь я хочу повернуть массив, который будет вращаться вокруг заднего пальца, так, чтобы желтая и зеленая линии были выровнены. Но как мне это сделать?

Обратите внимание, что хотя это изображение только 2D (только максимальные значения каждого датчика), я хочу рассчитать его для трехмерного массива (в среднем 10x10x50). Недостатком моего вычисления угла также является то, что он очень чувствителен к обнаружению пальцев, поэтому, если у кого-то есть более математически правильное предложение для расчета этого, я весь слух.

Я видел одно исследование с измерениями давления на людях , где они использовали метод локальной геометрической инерциальной оси, который, по крайней мере, был очень надежным. Но это все еще не помогает мне объяснить, как вращать массив!

alt text

Если кто-то чувствует необходимость в эксперименте, вот файл с всеми нарезанными массивами, которые содержат данные о давлении каждой лапы . Для пояснения: walk_sliced_data - это словарь, который содержит ['ser_3', 'ser_2', 'sel_1', 'sel_2', 'ser_1', 'sel_3'], которые являются названиями измерений. Каждое измерение содержит другой словарь, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (пример из «sel_1»), который представляет воздействия, которые были извлечены.

Ответы [ 2 ]

3 голосов
/ 22 января 2011

Зачем ты так поступил? Почему бы просто не объединить весь регион и сравнить? В этом случае вы получите величину силы и сможете просто сравнить скаляры, что было бы намного проще.

Если вам нужно как-то сравнить регионы (и, следовательно, именно поэтому вам нужно их выровнять), то, возможно, попытайтесь извлечь и выровнять объекты. Но это может показаться неудачным, если карты давления не схожи (скажем, кто-то не ставит много ждать на одну ногу).

Полагаю, вы можете получить действительно сложную информацию, но звучит так, будто вы просто рассчитываете силу - это то, что вам нужно?

Кстати, вы можете использовать простой корреляционный тест, чтобы найти оптимальный угол и сдвиг, если изображения похожи.

Для этого вы просто вычисляете корреляцию между двумя разными изображениями для различных переводов и вращений.

2 голосов
/ 22 января 2011

Используя Python Imaging Library , вы можете вращать массив, например:

array(Image.fromarray(<data>).rotate(<angle>, resample=Image.BICUBIC))

Оттуда вы можете просто создать цикл for для разных слоев вашего 3Dмассив.

Если у вас есть первое измерение в качестве слоев, то array[<layer>] вернет 2D-слой, таким образом:

for x in range(<amount of layers>):
    layer = <array>[i]
    <array>[i] = (Image.fromarray(layer).rotate(<angle>, resample=Image.BICUBIC))

Результаты по @IvoFlipse, с разговором предлагает:

  • Помещение массива в больший массив для исправления более темного фона.
  • Посмотрите на передискретизацию, возможно, сначала масштабируйте массив.задний носок к середине позволяет вам вращаться вокруг этого.
  • Меньшее изображение можно определить, найдя границы и снова поместив их в 15x15.

alt text

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...