3.2.5. 傅立叶变换与卷积

概念与内涵

FFT实现卷积

通过补零将卷积核与数据补成相同大小, 然后对各自做FFT,

注解

FFT实现二维图像卷积(卷积步长为1)

输入: 数据矩阵 \({\bm I} \in {\mathbb R}^{I_h\times I_W}\), 卷积核 \({\bm K} \in {\mathbb R}^{K_h\times K_w}\) 输出: 卷积结果 \({\bm O} = {\bm I} * {\bm K}\), 其中, \({\bm O} \in {\mathbb R}^{O_h\times O_w}\), \(O_h = I_h+K_h/2-1\), \(O_w = I_w+K_w/2-1\)

Step 1: 对数据矩阵 \({\bm I}\) 与卷积核 \({\bm K}\) 周边进行补零, 补成 \({O_h \times O_W}\) 大小的矩阵

Step 2: 对数据矩阵 \({\bm I}\) 做二维傅里叶变换, 得到其频域二维形式 \(I = {\rm FFT}({\bm I})\)

Step 3: 对卷积核矩阵 \({\bm K}\) 做二维傅里叶变换, 得到其频域二维形式 \(K = {\rm FFT}(\bm K)\)

Step 4: 通过频域相乘(对应元素相乘)得到卷积后的频域结果 \(O = G \odot H\)

Step 5: 通过逆傅里叶变换得到卷积结果 \({\bm O} = {\rm IFFT}(O)\)

Step 6: \({\bm O}\)

设有数据矩阵 \({\bm I} \in {\mathbb R}^{I_h\times I_W}\), 卷积核 \({\bm K} \in {\mathbb R}^{K_h\times K_w}\), 利用FFT实现图像二维卷积的步骤为

  1. 将数据矩阵 \({\bm I} \in {\mathbb R}^{H\times W}\),

实验与分析

FFT实现二维矩阵卷积

MATLAB代码:

代码 3.4 demo_Array_FFT_Conv2d.m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
clear all

% ---data
X = [1 2 3 4 5 6; 5 6 7 8 9 10; 9 10 11 12 13 14; 9 10 11 12 13 14; 9 10 11 12 13 14; 9 10 11 12 13 14];
[Xh, Xw, Xc] = size(X);

% ---convolution kernel
K = [0 1 1;-1 0 1;-1 -1 0];


[Kh, Kw] = size(K);

% ---pad (zeros) kernel to the same size of data X
KK = zeros(Xh, Xw);
KK(1:Kh, 1:Kw) = K;

% ---FFT
Y = fft2(X);
H = fft2(KK);
Z  = Y .* H;
O1 = ifft2(Z);

% ---Conv2d valid
O2 = conv2(X, K, 'valid');

% ---Conv2d same
O3 = conv2(X, K, 'same');

disp('---By FFT')
disp(O1)

disp('---By Conv(valid)')
disp(O2)

disp('---By Conv(same)')
disp(O3)

>> demo_Array_FFT_Conv2d
---By FFT
   -8.0000   -8.0000  -20.0000  -20.0000  -20.0000  -20.0000
         0         0  -12.0000  -12.0000  -12.0000  -12.0000
   24.0000   24.0000   12.0000   12.0000   12.0000   12.0000
   16.0000   16.0000    4.0000    4.0000    4.0000    4.0000
    8.0000    8.0000   -4.0000   -4.0000   -4.0000   -4.0000
    8.0000    8.0000   -4.0000   -4.0000   -4.0000   -4.0000

---By Conv(valid)
    12    12    12    12
     4     4     4     4
    -4    -4    -4    -4
    -4    -4    -4    -4

---By Conv(same)
     3     9    11    13    15    24
     0    12    12    12    12    30
   -12     4     4     4     4    30
   -20    -4    -4    -4    -4    26
   -20    -4    -4    -4    -4    26
   -29   -23   -25   -27   -29    -1

FFT实现二维图像卷积

MATLAB代码:

代码 3.5 demo_Image_FFT_Conv2d.m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
clear all
close all

% ---image data
imgfile = 'trees.tif';
X = imread(imgfile);

X = X(:, :, 1);
[Xh, Xw, Xc] = size(X);

% ---convolution kernel
K = [0 1 1;-1 0 1;-1 -1 0];
[Kh, Kw] = size(K);

% ---pad (zeros) kernel to the same size of data X
KK = zeros(Xh, Xw);
KK(1:Kh, 1:Kw) = K;

% ---FFT
Y = fft2(X);
H = fft2(KK);
Z  = Y .* H;
O1 = ifft2(Z);

% ---Conv2d valid
O2 = conv2(X, K, 'valid');

% ---Conv2d same
O3 = conv2(X, K, 'same');

figure
subplot(221)
imshow(X, [])
title('Original')
subplot(222)
imshow(O1, [])
title('By FFT')
subplot(223)
imshow(O2, [])
title('By Conv2d (valid)')
subplot(224)
imshow(O3, [])
title('By Conv2d (same)')
axis tight




FFT实现图像二维卷积与直接卷积结果对比

图 3.11 FFT实现图像二维卷积与直接卷积结果对比

FFT实现图像二维卷积与直接卷积结果对比.