在python中旋转一个nxnxn矩阵

时间:2015-04-07 14:32:06

标签: python multidimensional-array rotation

我有一个大小为64x64x64的二进制数组,其中40x40x40的音量设置为" 1"和休息是" 0"。我一直在尝试使用skimage.transform.rotate和Opencv将这个立方体围绕z轴绕其中心旋转:

def rotateImage(image, angle):
    row, col = image.shape
    center = tuple(np.array([row, col]) / 2)
    rot_mat = cv2.getRotationMatrix2D(center, angle, 1.0)
    new_image = cv2.warpAffine(image, rot_mat, (col, row))
    return new_image

在openCV的情况下,我尝试在立方体(立方体[:,:,n = 1,2,3 ... p])中对每个单独切片进行2D旋转。

旋转后,数组中值的总和会发生变化。这可能是由旋转期间的插值引起的。如何在不向阵列添加任何内容的情况下旋转此类3D阵列?

2 个答案:

答案 0 :(得分:0)

好的,所以我现在明白你在问什么。我能想出的最接近的是scipy.ndimage。但是如果可能更容易,那么有一种方法可以与python中的imagej接口。但这是我用scipy.ndimage做的事情:

    from scipy.ndimage import interpolation
    angle = 25 #angle should be in degrees
    Rotatedim = interpolation.rotate(yourimage, angle, reshape = False,output = np.int32, order = 5,prefilter = False) 

这在某些角度可以保留一些而不是其他角度,可能通过使用您可能获得预期结果的参数来玩更多。

答案 1 :(得分:0)

一种选择是转换为稀疏,并使用矩阵旋转变换坐标。然后变回密集。在2个维度中,这看起来像:

import numpy as np
import scipy.sparse
import math


N = 10
space = np.zeros((N, N), dtype=np.int8)
space[3:7, 3:7].fill(1)
print(space)
print(np.sum(space))

space_coo = scipy.sparse.coo_matrix(space)
Coords = np.array(space_coo.nonzero()) - 3

theta = 30 * 3.1416 / 180

R = np.array([[math.cos(theta), math.sin(theta)], [-math.sin(theta), math.cos(theta)]])
space2_coords = R.dot(Coords)
space2_coords = np.round(space2_coords)
space2_coords += 3
space2_sparse = scipy.sparse.coo_matrix(([1] * space2_coords.shape[1], (space2_coords[0], space2_coords[1])), shape=(N, N))
space2 = space2_sparse.todense()
print(space2)
print(np.sum(space2))

输出:

[[0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 1 1 1 0 0 0]
 [0 0 0 1 1 1 1 0 0 0]
 [0 0 0 1 1 1 1 0 0 0]
 [0 0 0 1 1 1 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
16
[[0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 0 0]
 [0 0 1 1 1 1 0 0 0 0]
 [0 0 1 1 1 1 1 0 0 0]
 [0 1 1 0 1 1 0 0 0 0]
 [0 0 0 1 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
16

优点是您可以在转换之前和之后获得尽可能多的1值。缺点是你可能会得到如上所述的“漏洞”和/或重复的坐标,给出“' 2'在最后的密集矩阵中。