如何使用scipy.ndimage从指定位置旋转椭球布尔数组?
实现从指定位置旋转布尔数组的方法
要实现从指定位置而非数组中心旋转你的布尔mask,核心思路是先平移数组,把目标旋转中心移到数组的几何中心,旋转后再平移回原位置。下面是具体的步骤和代码实现:
步骤分解
- 确定目标旋转中心的坐标:先找到你想要的旋转点(比如椭球的一端)在原数组中的位置。
- 平移数组到中心对齐:计算平移量,将目标旋转中心移动到数组的几何中心,这样
ndimage.rotate的默认中心旋转就等价于绕目标点旋转。 - 执行旋转操作:对平移后的数组应用
ndimage.rotate。 - 平移回原位置:用相反的平移量把旋转后的数组移回原始坐标系。
具体代码实现
import numpy as np from scipy import ndimage from skimage import draw # 生成椭球mask mask = skimage.draw.ellipsoid(10, 12, 16) angle1 = 45 # 示例旋转角度 # -------------------------- # 步骤1:找到椭球一端的坐标(以z轴负方向端点为例) # -------------------------- # 获取所有mask为True的点的坐标 true_points = np.where(mask) # 取z坐标最小的点作为旋转中心(椭球的一端) rot_center = ( true_points[0][np.argmin(true_points[2])], true_points[1][np.argmin(true_points[2])], np.min(true_points[2]) ) print(f"旋转中心坐标:{rot_center}") # -------------------------- # 步骤2:计算平移量,将旋转中心移到数组中心 # -------------------------- # 数组的几何中心坐标(各维度长度的一半,取整数) array_center = np.array(mask.shape) // 2 # 平移量 = 数组中心 - 旋转中心 shift_amount = array_center - np.array(rot_center) # 平移数组,此时原旋转中心移到了数组中心 shifted_mask = ndimage.shift( mask.astype(float), # 先转成float方便平移,之后再转回布尔 shift_amount, mode='constant', cval=0.0 ).astype(bool) # -------------------------- # 步骤3:执行旋转 # -------------------------- rotated_shifted_mask = ndimage.rotate( shifted_mask, angle1, axes=(0, 2), reshape=False, # 保持原数组形状,可选 mode='constant', cval=False ) # -------------------------- # 步骤4:平移回原位置 # -------------------------- rotated_mask = ndimage.shift( rotated_shifted_mask.astype(float), -shift_amount, mode='constant', cval=0.0 ).astype(bool)
关键细节说明
- 布尔数组的平移处理:
ndimage.shift对布尔数组的支持有限,所以先转成float类型进行平移操作,完成后再转回bool,这样能避免不必要的类型错误。 mode参数设置:平移和旋转时用mode='constant'并设置cval=False,确保超出原数组范围的区域填充为False,符合布尔mask的逻辑。reshape参数:如果希望旋转后的数组保持原形状,可以设置reshape=False;如果允许扩展边界来容纳旋转后的内容,可以去掉这个参数(默认是True)。
内容的提问来源于stack exchange,提问作者Astro
相关产品推荐
相关产品推荐

