我需要一段代码来使用numpy在python中执行3D卷积,使用3x3内核。我已经做了正确的二维阵列,如黑白图像,但当我试图扩展到三维阵列,如RGB是一个烂摊子。我需要帮助来改进我的方法。 这是二维码:
def convolucion_3x3(arreglo, kernel):
(dim_x, dim_y) = arreglo.shape
(ker_x, ker_y) = kernel.shape
matriz_convolucionada = np.zeros((dim_x, dim_y))
for i in range(dim_x):
for j in range(dim_y):
resultado = 0
for x in range(-1, 2):
try:
if i + x not in range(dim_x):
raise ValueError()
for y in range(-1, 2):
try:
if j + y not in range(dim_y):
raise ValueError()
resultado += arreglo[i + x, j + y] * kernel[x + 1][y + 1]
'''
Para el kernel sumo un 1 a cada índice para que lo corra desde 0 hasta 2 y no de -1 a 1
'''
except ValueError:
pass
except ValueError:
pass
matriz_convolucionada[i][j] = resultado
return matriz_convolucionada
下一个是我对RGB图像的尝试:
def constralucion(arreglo,内核): (尺寸x,尺寸y,尺寸z)=阿雷格洛形状 (你,你)=内核.形状在
^{pr2}$
虽然循环可以工作,但跟踪嵌套循环也很困难。您可以考虑调用卷积定理来更容易地执行卷积。见here。在
使用numpy的fft模块,您可以计算原始图像堆栈的n维离散Fourier变换,并将其乘以大小相同的核的n维Fourier变换(文档可找到here)。因为你的2D内核是一个3x3数组,它是一个3x3xz正方形的“支柱”,你可以用0填充这个数组来相应地增加维数。在
试试这个:
这将半径为2的球体与边长为3的支柱卷积在一起。在
相关问题 更多 >
编程相关推荐