Размерность фильтра в 3-D свертке в MATLAB


Функция для выполнения N-мерной свертки массивов A и B в matlab показана ниже:

C = convn(A,B) % returns the N-dimensional convolution of arrays A and B.
Меня интересует трехмерная свертка с гауссовым фильтром. Если A является матрицей 3 x 5 x 6, Какими должны быть размеры B?
1 2

1 ответ:

Размеры B могут быть любыми, какими вы хотите. Нет никаких установленных ограничений по размеру. Для Гауссова фильтра, он может быть в 1D, 2D или 3D. В 1D, что случится, что каждая строка получает отфильтрованные самостоятельно. В 2D произойдет то, что каждый срез будет фильтроваться независимо. Наконец, в 3D вы будете делать то, что ожидается в 3D свертке. Я предполагаю, что вы хотели бы получить полную трехмерную свертку, а не только 1D или 2D.

Возможно, вас заинтересует выходной размер convn. Если обратиться к документации, заданной двумя N размерными матрицами, для каждой размерности k вывода и если nak - размер размерности k для матрицы A и nbk - размер размерности k для матрицы B, то размер размерности выходной матрицы C или nck таков, что:

nck = max([nak + nbk - 1, nak, nbk])

nak + nbk - 1 это прямо из теории свертки. Конечный выходной размер измерения-это просто сумма двух размеров в измерении k вычитается 1. Однако если это значение меньше любого из nak или nbk, мы должны убедиться, что размер вывода совместим, так что любая из входных матриц может поместиться в конечный вывод. Вот почему у вас есть конечный выходной размер и ограничен как A, так и B.

Чтобы сделать это проще, вы можете установить размер фильтра, руководствуясь стандартным отклонением распределения. Я хотел бы сослаться на мой предыдущий пост переполнения стека: по каким показателям должен ли я установить размер моего гауссова фильтра в MATLAB? Это определяет, какой выходной размер гауссова фильтра должен быть задан стандартным отклонением.

В 2D размеры фильтра N x N таковы, что N = ceil(6*sigma + 1) с sigma является желаемым стандартным отклонением. Таким образом, вы бы выделили трехмерную матрицу размера N x N x N С N = ceil(6*sigma + 1);.

Таким образом, код, который вы хотите использовать для создания 3D-фильтра Гаусса, будет выглядеть примерно так: это:

% Example input
A = rand(3, 5, 6);
sigma = 0.5; % Example

% Find size of Gaussian filter
N = ceil(6*sigma + 1);

% Define grid of centered coordinates of size N x N x N
[X, Y, Z] = meshgrid(-N/2 : N/2);

% Compute Gaussian filter - note normalization step
B = exp(-(X.^2 + Y.^2 + Z.^2) / (2.0*sigma^2));
B = B / sum(B(:));

% Convolve
C = convn(A, B);
Последнее замечание состоит в том, что если фильтр, который вы предоставляете, имеет какие-либо из своих измерений, которые выходят за пределы размера входной матрицы A, вы получите матрицу, используя ограничения каждого значения nck, но тогда граничные элементы будут обнулены из-за заполнения нулем.