питон: бесшумное трехмерное вращение? - PullRequest
0 голосов
/ 19 декабря 2018

Фон:

Вариант использования: Я хочу построить трехмерную сетку человеческого тела из нескольких изображений.Точнее говоря, сейчас я пытаюсь повернуть трехмерный массив numpy, чтобы я мог применить следующую «маску» человеческого тела, чтобы я мог получить воксельное представление кожи, из которого можно сделать меш наиболее конкретнопроблема в том, что scipy.ndimage.rotate() не делает то, что мне нужно для 3-х измерений (хотя отлично работает для 2-х измерений).Это также не подходит для произвольных углов поворота (т.е. 72,9 градуса вместо 90,0 градуса).Он либо оставляет «выключенные» вокселы там, где должны быть «включенные» воксели, либо (если я использую непрерывные числа вместо логических значений), он оставляет МНОГО «включенных» вокселей, где должны быть выключены вокселы.Есть ли лучшая функция rotate(), которая решает эту проблему шума?

Информация о версии:

Особенности версии: python 2.7.15: Anaconda, Inc. numpy 1.11.3 py27h3dfced4_4 numpy-base 1.14.5 py27hdbf6ddf_4 scipy 1.1.0 py27hc49cb51_0 выходные данные uname -a: Linux elon-eats-my-shorts 4.15.0-42-generic # 45 ~ 16.04.1-Ubuntu SMP Mon Nov 19 13:02: 27 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux

Код:

#====================================================

def rot8(model, angle):
  xy=(1,0); return uint_mids(   scipy.ndimage.rotate(model, angle, axes=xy, reshape=False, mode='constant'))

#====================================================

def uint_mids(arr):
  # NOTE:  do we want this to run on floats?  TODO:   try multiple ways (first on uint8, then float, etc.)
  UINT8_MAX=np.iinfo('uint8').max; MID=int(round(UINT8_MAX/2.))
  arr[np.greater(arr, 0)]=MID; return arr

#====================================================

Результаты:

Я ожидаю этихВ результате plt.show () выглядит как двухмерное изображение человеческого тела с минимальным шумом.Вместо этого я либо получаю A) отверстия внутри человеческого тела, либо B) "тело" снаружи, где оно должно быть:

A)

too many

B)

too many

Для минимального примера неточности scipy.ndimage.rotate(), пожалуйста, поиграйте с кодом в по этой ссылке .re: John

До вращения: 8 voxels

После вращения: 18 voxels?

Метод rotate()создал новые воксели!Я ищу rotate_in_3D() метод, который не делает этого

1 Ответ

0 голосов
/ 20 декабря 2018

Если я правильно понимаю, у вас есть серия 2D-изображений 3D-формы, взятых с разных направлений, и вы пытаетесь воссоздать 3D-контур формы.

Был бы алгоритм, подобный этомудостичь того, чего вы хотите достичь (псевдокод)?

Initialize all of your voxels to 1
for (mask,angle) in zip(images,directions):
    for pixel in mask:
        if pixel_value < threshold:
            # Nothing there
            draw line along angle offset by pixel location
            set value of every voxel intersected by this line to 0

Я думаю, что было бы проще повернуть 2D-изображения, чем вращать 3D-модель.

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

...