python - 3d 数组与每个通道的 2d 内核分别进行卷积
python - Convolution of 3d array with 2d kernel for each channel separately
我有一个大小为 [c, n, m]
的矩阵,其中 c
是通道数; n
和 m
是宽度和高度。在特定示例中,我有一个具有 1000 个通道的矩阵。我想分别为每个通道与大小为 a x a
的内核进行卷积。在我的示例中,内核大小为 3 x 3
。 scipy
或 numpy
中是否有任何函数可以在不使用循环迭代通道的情况下执行此类操作?
我找到了 scipy.ndimage.convolve
函数,但我认为我不能在不使用循环的情况下将该函数应用到这个问题上。
将矩阵视为图像并使用 opencv。将数组的形状更改为 [height, width, num_channels]。然后运行 filter2D(图像的卷积函数)在opencv.
image = cv2.imread("some_image.jpg")
image.shape # (height, width, 3) # 3 is 3 channels for Red, Green, Blue
kernel = np.ones((3,3)) / 9.
image_blurred = cv2.filter2D(image, cv2.CV_64F, kernel) # will apply the kernel for each channel. You can have more than 3 channels.
我认为你只需要让你的内核三维化。像这样的东西应该可以工作:
kernel = kernel[:, :, None]
如果 scipy.ndimage.convolve
不适用于 3D 阵列,您可以尝试 scipy.signal.convolve
。
我有一个大小为 [c, n, m]
的矩阵,其中 c
是通道数; n
和 m
是宽度和高度。在特定示例中,我有一个具有 1000 个通道的矩阵。我想分别为每个通道与大小为 a x a
的内核进行卷积。在我的示例中,内核大小为 3 x 3
。 scipy
或 numpy
中是否有任何函数可以在不使用循环迭代通道的情况下执行此类操作?
我找到了 scipy.ndimage.convolve
函数,但我认为我不能在不使用循环的情况下将该函数应用到这个问题上。
将矩阵视为图像并使用 opencv。将数组的形状更改为 [height, width, num_channels]。然后运行 filter2D(图像的卷积函数)在opencv.
image = cv2.imread("some_image.jpg")
image.shape # (height, width, 3) # 3 is 3 channels for Red, Green, Blue
kernel = np.ones((3,3)) / 9.
image_blurred = cv2.filter2D(image, cv2.CV_64F, kernel) # will apply the kernel for each channel. You can have more than 3 channels.
我认为你只需要让你的内核三维化。像这样的东西应该可以工作:
kernel = kernel[:, :, None]
如果 scipy.ndimage.convolve
不适用于 3D 阵列,您可以尝试 scipy.signal.convolve
。