我有一个大小为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阵列?
答案 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'在最后的密集矩阵中。