python for i in range 三维_python中的三维卷积

虽然循环可以工作,但跟踪嵌套循环也很困难。您可以考虑调用卷积定理来更容易地执行卷积。见here。在

使用numpy的fft模块,您可以计算原始图像堆栈的n维离散Fourier变换,并将其乘以大小相同的核的n维Fourier变换(文档可找到here)。因为你的2D内核是一个3x3数组,它是一个3x3xz正方形的“支柱”,你可以用0填充这个数组来相应地增加维数。在

试试这个:import numpy as np

import math

radius = 2

r2 = np.arange(-radius, radius+1)**2

sphere = r2[:, None, None] + r2[:, None] + r2

sphere -= np.max(sphere)

sphere = -sphere*2

array_len = 10*radius

array = np.zeros((array_len, array_len, array_len))

center = slice(array_len//2-radius,

array_len//2+radius+1), slice(array_len//2-radius,

array_len//2+radius+1),slice(array_len//2-radius,

array_len//2+radius+1)

array[center] = sphere

k_len = 3

kernel_2D = np.ones((k_len,k_len))

kernel = np.zeros_like(array)

center_k = slice(array_len//2-math.ceil(k_len/2),

array_len//2+k_len//2), slice(array_len//2-math.ceil(k_len/2),

array_len//2+k_len//2)

for i in range(kernel.shape[2]):

kernel[center_k+(i,)] = kernel_2D

def fft(array):

fft = np.fft.ifftshift(np.fft.fftn(np.fft.fftshift(array)))

return fft

def ifft(array):

ifft = np.fft.fftshift(np.fft.ifftn(np.fft.ifftshift(array)))

return ifft

def conv_3D(array, kernel):

conv = np.abs(ifft(fft(array)*fft(kernel)))

return conv

conv = conv_3D(array, kernel)

这将半径为2的球体与边长为3的支柱卷积在一起。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值