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实现图像二维卷积的步骤为
将数据矩阵 \({\bm I} \in {\mathbb R}^{H\times W}\),
实验与分析¶
FFT实现二维矩阵卷积¶
MATLAB代码:
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代码:
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
|