matlab - 使用傅立叶域卷积复制 MATLAB 的 `conv2()`

标签 matlab image-processing fft convolution

我想拍摄两张图像并在 Matlab 中使用 2D FFT 将它们卷积在一起,而无需求助于 conv2 函数。但是,我不确定应该如何正确填充矩阵并为卷积做准备。

数学运算如下:

A * B = C

在上面,*是卷积运算符(Wikipedia link)。

下面的 Matlab 程序显示了填充和不填充矩阵之间的区别。我怀疑不填充矩阵会导致循环卷积,但我想执行没有混叠的线性卷积

如果我填充两个矩阵,那么我该如何截断卷积的输出,使 CAB< 的大小相同/strong>?

A = rgb2gray(im2double(imread('1.png'))); % input A
B = rgb2gray(im2double(imread('2.png'))); % kernel B

figure;
imagesc(A); colormap gray;
title ('A')

figure;
imagesc(B); colormap gray;
title ('B')

[m,n] = size(A);
mm = 2*m - 1;
nn = 2*n - 1;

C = (ifft2(fft2(A,mm,nn).* fft2(B,mm,nn)));

figure;
imagesc(C); colormap gray;
title ('C with padding')

C0 = (ifft2(fft2(A).* fft2(B)));

figure;
imagesc(C0); colormap gray;
title ('C without padding')

这是程序的输出:

A B C C0

最佳答案

没有填充,结果将等同于您指出的循环卷积。对于线性卷积,在对 2 个图像(2D 信号)A*B 进行卷积时,完整输出的大小为 Ma+Mb-1 x Na+Nb-1,其中 Ma x Na, Mb x Nb 图像 A 和 B 的大小。

填充到预期大小后,通过ifft2 进行相乘和变换,您可以保留结果图像的中心部分(通常对应于 A 和 B 中最大的一个)。

A = double(imread('cameraman.tif'))./255; % image
B = fspecial('gaussian', [15 15], 2); % some 2D filter function

[m,n] = size(A);
[mb,nb] = size(B); 
% output size 
mm = m + mb - 1;
nn = n + nb - 1;

% pad, multiply and transform back
C = ifft2(fft2(A,mm,nn).* fft2(B,mm,nn));

% padding constants (for output of size == size(A))
padC_m = ceil((mb-1)./2);
padC_n = ceil((nb-1)./2);

% frequency-domain convolution result
D = C(padC_m+1:m+padC_m, padC_n+1:n+padC_n); 
figure; imshow(D,[]);

现在,将上面的内容与使用 conv2D 进行空间域卷积进行比较

 % space-domain convolution result
 F = conv2(A,B,'same');
 figure; imshow(F,[]);

结果在视觉上是相同的,两者之间的总误差(由于四舍五入)大约为 e-10。

关于matlab - 使用傅立叶域卷积复制 MATLAB 的 `conv2()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253984/

相关文章:

matlab - Github 将 Matlab .m 文件错误分类为 Objective-C 文件

python - 快速傅立叶变换算法因单个减号而错误

image-processing - 以编程方式将扫描图像划分为单独的图像

image-processing - 指纹图像比较

matrix - 为什么在计算矩阵/多维数组的FFT时需要计算转置?

java - FFT频率分析似乎得到了错误的值

php - 我可以在网站上运行 MATLAB 代码吗?

matlab - 如何去除CMOS相机中的相机噪音

matlab - Simulink无法从输出端口1传播可变大小模式

python - 如何使用 Python OpenCV 查找表格图像中的行数和列数?