在Python中旋转nxnxn矩阵

问题描述 投票:0回答:2

我有一个大小为 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 的情况下,我尝试了立方体中每个单独切片的 2D 旋转(Cube[:,:,n=1,2,3...p])。

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

python multidimensional-array rotation
2个回答
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) 

这对某些角度有效,可以保留某些角度,而不是其他角度,也许通过更多地调整参数,您可能能够得到您想要的结果。


0
投票

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

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”。

© www.soinside.com 2019 - 2024. All rights reserved.