Я начну с очень краткого обсуждения свертки , используя следующее изображение из Википедии:
Как показано, сворачивая два 1-D-функции включают в себя отражение одной из них (то есть ядра свертки), скольжение двух функций друг над другом и вычисление интеграла их произведения.
При свертывании двумерных матриц ядро свертки отражается в обоих измерениях , а затем сумма произведений вычисляется для каждой уникальной комбинации перекрытий с другой матрицей.Это отражение размеров ядра является неотъемлемым этапом свертки.
Тем не менее, при выполнении фильтрации нам нравится думать о матрице фильтрации, как о «трафарете», который непосредственно укладывается как есть. (то есть без отражений) над фильтруемой матрицей.Другими словами, мы хотим выполнить эквивалентную операцию в виде свертки, но без отражения размеров матрицы фильтрации.Поэтому, чтобы отменить отражение, выполненное во время свертки, мы можем добавить дополнительное отражение размеров матрицы фильтра перед выполнением свертки.
Теперь для любой данной двумерной матрицы A
,Вы можете доказать себе, что переключение обоих измерений эквивалентно повороту матрицы на 180 градусов, используя функции FLIPDIM и ROT90 в MATLAB:
A = rand(5); %# A 5-by-5 matrix of random values
isequal(flipdim(flipdim(A,1),2),rot90(A,2)) %# Will return 1 (i.e. true)
Этопочему filter2(f,A)
эквивалентно conv2(A,rot90(f,2),'same')
.Чтобы дополнительно проиллюстрировать, как существуют различные представления о матрицах фильтров и ядрах свертки, мы можем посмотреть, что происходит, когда мы применяем FILTER2 и CONV2 к одному и тому же набору матриц f
и A
, определяется следующим образом:
>> f = [1 0 0; 0 1 0; 1 0 0] %# A 3-by-3 filter/kernel
f =
1 0 0
0 1 0
1 0 0
>> A = magic(5) %# A 5-by-5 matrix
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Теперь при выполнении B = filter2(f,A);
вычисление выходного элемента B(2,2)
можно визуализировать, выровняв центральный элемент фильтра с A(2,2)
и умножив перекрытиеelements:
17*1 24*0 1*0 8 15
23*0 5*1 7*0 14 16
4*1 6*0 13*0 20 22
10 12 19 21 3
11 18 25 2 9
Поскольку элементы вне матрицы фильтра игнорируются, мы видим, что сумма произведений будет 17*1 + 4*1 + 5*1 = 26
.Обратите внимание, что здесь мы просто кладем f
поверх A
, как «трафарет», который воспринимает матрицы фильтра для работы с матрицей.
Когда мы выполняем B = conv2(A,f,'same');
, вычислениевыходной элемент B(2,2)
вместо этого выглядит следующим образом:
17*0 24*0 1*1 8 15
23*0 5*1 7*0 14 16
4*0 6*0 13*1 20 22
10 12 19 21 3
11 18 25 2 9
и сумма произведений вместо этого будет 5*1 + 1*1 + 13*1 = 19
.Обратите внимание, что когда f
считается ядром свертки, мы должны перевернуть его размеры, прежде чем положить его поверх A
.