Изменение формы массива - PullRequest
0 голосов
/ 15 ноября 2018

То, что я пытаюсь сделать, это взять массив данных, представляющий данные трехмерного изображения, и вычислить матрицу гессиана для каждого вокселя.Мой ввод представляет собой матрицу формы (Z, X, Y), и я могу легко взять срез вдоль z и извлечь одно исходное изображение.

gx, gy, gz = np.gradient(imgs)

gxx, gxy, gxz = np.gradient(gx)
gyx, gyy, gyz = np.gradient(gy)
gzx, gzy, gzz = np.gradient(gz)

И я могу получить доступ к гессиану для отдельного вокселя следующим образом:

x = 100
y = 100
z = 63

H = [[gxx[z][x][y], gxy[z][x][y], gxz[z][x][y]],
     [gyx[z][x][y], gyy[z][x][y], gyz[z][x][y]],
     [gzx[z][x][y], gzy[z][x][y], gzz[z][x][y]]]

Но это громоздко, и я не могу легко разрезать данные.

Я пытался использовать reshape следующим образом

H = H.reshape(Z, X, Y, 3, 3) 

Но когда я проверяю это, получая гессиан для определенного вокселя, значение, возвращаемое из массива с измененной формой, полностью отличается от исходногомассив.

Я думаю, что мог бы как-то использовать zip, но мне удалось найти его только для составления списков кортежей.

  • Бонус : Если есть более быстрый способ сделать это, пожалуйста, дайте мне знать, мне по сути нужно вычислить три собственных значения гессианской матрицы для каждого вокселя в наборе трехмерных данных,Вычисление значений гессиана действительно быстро, но поиск собственных значений для одного среза 2D-изображения занимает около 20 секунд.Существуют ли графические процессоры или ускоренные библиотеки для обработки изображений?

1 Ответ

0 голосов
/ 15 ноября 2018

Мы можем использовать понимание списка, чтобы получить гессиан -

H_all = np.array([np.gradient(i) for i in np.gradient(imgs)]).transpose(2,3,4,0,1)

Просто для небольшого объяснения: [np.gradient(i) for i in np.gradient(imgs)] проходит через два уровня выходных сигналов от вызовов np.gradient, в результате чего получается тензор в форме (3 x 3) на внешних двух осях. Нам нужны эти две последние две оси в окончательном выводе. Итак, мы выдвигаем их в конце транспонированием.

Таким образом, H_all содержит все гессианы и, следовательно, мы можем извлечь наш конкретный гессиан, заданный x,y,z, например, -

x = 100
y = 100
z = 63
H = H_all[z,y,x]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...