2d свертка с использованием fftw для общего ядра - PullRequest
0 голосов
/ 20 декабря 2018

Я использую fftw для выполнения двумерной свертки зеркальных реальных изображений.До сих пор поддерживаемые ядра всегда были квадратными и симметричными (например, блочное ядро, радиальное ядро ​​...).Эти ядра, очевидно, охватывают большинство, если не все, варианты использования.Однако при игре с ядрами, которые асимметричны по содержанию и / или размерам, мой код больше не сравнивается с результатом свертки, выполненной в прямом пространстве.Я думаю, что это происходит от того, как я смещаю центр своего ядра в верхний угол изображения перед вычислением БПФ.

Я использую следующую схему перед выполнением БПФ:

- expand and mirror pad my image by half the kernel size:
- expand my kernel
- shift its original contents to the topleft corner

Например, для блочного ядра 3x3, которое будет использоваться, скажем, для изображения 4x4, это дает (я упускаю коэффициент нормализации ядра для удобства чтения)

image (4x4):

 a b c d
 e f g h
 i j k l
 m n o p

зеркально заполненное изображение на половину размера ядра (6x6):

a a b c d d
a a b c d d
e e f g h h
i i j k l l
m m n o p p
m m n o p p

ядро ​​со смещением по центру (6x6) :

    1 1 0 0 0 1
    1 1 0 0 0 1
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    1 1 0 0 0 1

Эта схема дает отличные результаты независимо от размера исходного изображения, пока мое ядро ​​имеет форму (2k + 1,2k + 1) и с симметричным содержимым.

Используя мою схему, следующие (фиктивные) ядра не могут должным образом свернуть мои данные

однорядное ядро ​​(1,3):

           1 1 0 0 0 1
           0 0 0 0 0 0
1 1 1 ---> 0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0

Ядро с одним столбцом (3,1):

           1 0 0 0 0 0
1          1 0 0 0 0 0
1     ---> 0 0 0 0 0 0
1          0 0 0 0 0 0
           0 0 0 0 0 0
           1 0 0 0 0 0

Ядро асимметричного ящика (1,3):

           2 4 0 0 0 1
           0 0 0 0 0 0
1 2 4 ---> 0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0

даже-sized box kernel (2,2):

            2 2 0 0 0 0
2 2         2 2 0 0 0 0
2 2    ---> 0 0 0 0 0 0
            0 0 0 0 0 0
            0 0 0 0 0 0
            0 0 0 0 0 0

Не могли бы вы представить, что я делаю неправильно, когда настраиваю свою расширенную матрицу ядра?

...