3D矩阵切片的2D卷积

3
我正在尝试在MATLAB中对矩阵进行一系列滚动求和。为了避免使用循环,我使用repmat将我的二维矩阵分层成一个三维结构。然而,现在快速卷积函数conv2不能再用于累加器。不过,N维卷积函数(convn)也不是我想要的,因为它会在所有三个维度上进行卷积。我需要的是在每个切片上执行二维卷积并返回一个三维矩阵。
将矩阵在二维平铺而不是分层到三维中是行不通的,因为这会破坏卷积边缘情况。我可以在它们之间填充零,但这样就变得有点凌乱了。
换句话说,没有for循环,我该如何执行以下操作:
A = ones(5,5,5);
B = zeros(size(A));
for i = 1 : size(A, 3)
    B(:,:,i) = conv2(A(:,:,i), ones(2), 'same');
end

感谢您提前提供的帮助!

这里需要翻译的内容与 IT 技术有关。

1
convn不能用于3D矩阵和2D滤波器吗? - beaker
@beaker 那似乎也可以工作! - Divakar
2
@Divakar 说到底,一个二维卷积核实际上是一个三维卷积核,只不过第三个维度的大小为1 ;) - beaker
哈哈,直到现在我甚至都没去看convn - Divakar
@Divakar 我会的...我最初将其添加为注释,因为昨天我把我的主要电脑送到了商店,所以我依赖Octave,但现在已经确认了... - beaker
显示剩余2条评论
2个回答

6

convn函数可以处理n维矩阵和2维滤波器。简单来说:

A = ones(5,5,5);
B = convn(A, ones(2), 'same');

3
你可以使用一些零填充和重塑来实现,如下所示 -
%// Store size parameters
[m,n,r] = size(A)  
[m1,n1] = size(kernel) 

%// Create a zeros padded version of the input array. We need to pad zeros at the end
%// rows and columns to replicate the convolutionoperation around those boundaries
Ap = zeros(m+m1-1,n+n1-1,r);
Ap(1:m,1:n,:) = A;

%// Reshape the padded version into a 3D array and apply conv2 on it and
%// reshape back to the original 3D array size
B_vect = reshape(conv2(reshape(Ap,size(Ap,1),[]),kernel,'same'),size(Ap))

%// Get rid of the padded rows and columns for the final output
B_vect = B_vect(1:m,1:n,:);

基本思路是将输入的3D数组重新塑造为2D数组,然后在其上应用2D卷积。需要额外的步骤进行填充,以便在边界处具有与conv2相同的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接