Физическая значимость вращения матрицы фильтра в функции filter2 - PullRequest
4 голосов
/ 22 декабря 2010

При использовании функции фильтра MATLAB 2D filter2(B,X) и функции свертки conv(X,B,'') я вижу, что функция filter2 по сути является двумерной сверткой, но с поворотом на 180 градусов матрицы коэффициентов фильтра. Что касается выходных данных filter2 и conv2, я вижу, что справедливо следующее соотношение:

 output matrix of filter2 = each element negated of output of conv2

РЕДАКТИРОВАТЬ: я был не прав; вышеупомянутое отношение не выполняется в целом, но я видел это в нескольких случаях. В общем, две выходные матрицы не связаны, поскольку в обоих получается 2 совершенно разных ядра, которые используются для свертки.

Я понимаю, как выполняется двумерная свертка. То, что я хочу понять, является смыслом этого в терминах обработки изображений. Как мне визуализировать, что здесь происходит? Что значит повернуть матрицу коэффициентов фильтра на 180 градусов?

1 Ответ

6 голосов
/ 22 декабря 2010

Я начну с очень краткого обсуждения свертки , используя следующее изображение из Википедии:

alt text

Как показано, сворачивая два 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.

...