利用时域(空域)卷积定理进行图像滤波(Matlab 实现)(一)

时域卷积定理证明

卷积定理:
f ( t ) ∗ g ( t ) = ∫ − ∞ ∞ f ( τ ) g ( t − τ ) d τ f(t) * g(t) = \int^{\infty}_{-\infty} f(\tau)g(t-\tau)d\tau f(t)g(t)=f(τ)g(tτ)dτ

求傅里叶变换:
F [ f ( t ) ∗ g ( t ) ] = ∫ − ∞ ∞ [ ∫ − ∞ ∞ f ( τ ) g ( t − τ ) d τ ] e − j w t d t   【 交 换 积 分 顺 序 】 = ∫ − ∞ ∞ f ( τ ) [ ∫ − ∞ ∞ g ( t − τ ) e − j w t d t ] d τ   【 时 移 定 理 】 = ∫ − ∞ ∞ f ( τ ) G ( w ) e − j w τ d τ = F ( w ) ⋅ G ( w ) = F [ f ( t ) ] ⋅ F [ g ( t ) ] \begin{aligned} \mathcal {F}[f(t) * g(t)] & = \int^{\infty}_{-\infty} \bigg[\int^{\infty}_{-\infty}f(\tau)g(t-\tau)d\tau\bigg] e^{-jwt}dt \ 【交换积分顺序】\\ & = \int^{\infty}_{-\infty}f(\tau) \bigg[\int^{\infty}_{-\infty}g(t-\tau)e^{-jwt}dt\bigg] d\tau \ 【时移定理】\\ & = \int^{\infty}_{-\infty}f(\tau)G(w)e^{-jw\tau}d\tau \\ & = F(w)\cdot G(w) \\ & = \mathcal{F}[f(t)] \cdot \mathcal{F}[g(t)] \end{aligned} F[f(t)g(t)]=[f(τ)g(tτ)dτ]ejwtdt =f(τ)[g(tτ)ejwtdt]dτ =f(τ)G(w)ejwτdτ=F(w)G(w)=F[f(t)]F[g(t)]

得证。

同理,二维傅里叶变换也应当满足该定理:
F [ f ( x , y ) ∗ g ( x , y ) ] = F [ f ( x , y ) ] ⋅ F [ g ( x , y ) ] \mathcal{F}[f(x,y)*g(x,y)]=\mathcal{F}[f(x,y)]\cdot\mathcal{F}[g(x,y)] F[f(x,y)g(x,y)]=F[f(x,y)]F[g(x,y)]


利用时域(空域)卷积定理处理图像的 Matlab 实现

代码:

clear,  clc, close all

img_raw = imread('cameraman.tif');
img = double(img_raw);
freq_img = fft2(img);  % 原图像的傅里叶变换

gaussian = [1, 2, 1; 2, 4, 2; 1, 2, 1] / 16;  % Gaussian 模板
laplacian = [0, 1, 0; 1, -4, 1; 0, 1, 0];  % Laplacian 模板
filter = zeros(size(img));  % 滤波器大小与图像大小一致
filter_gau = filter;  filter_gau(1:3, 1:3) = gaussian;
filter_lap = filter;  filter_lap(1:3, 1:3) = laplacian;
freq_gau = fft2(filter_gau);  % Gaussian 滤波器的傅里叶变换
freq_lap = fft2(filter_lap);  % Laplacian 滤波器的傅里叶变换

% 利用时域(空域)卷积定理将傅里叶变换后的图像与滤波器点乘,再求反变换,得到滤波后的图像
img_gau = ifft2(freq_gau .* freq_img);  % Gaussian 滤波图像
img_gau = uint8(real(img_gau));
img_lap = ifft2(freq_lap .* freq_img);  % Laplacian 滤波图像
img_lap = uint8(real(img_lap));

% 使用自带卷积函数
img_gau_conv = uint8(conv2(img, gaussian, 'same'));
img_lap_conv = uint8(conv2(img, laplacian, 'same'));

% 画图
subplot(2, 3, 1);  imshow(img_raw);  title('原图');
subplot(2, 3, 2);  imshow(img_gau);  title('Gaussian 滤波图(定理)');
subplot(2, 3, 3);  imshow(img_gau_conv);  title('Gaussian 滤波图(conv2)');
subplot(2, 3, 5);  imshow(img_lap);  title('Laplacian 滤波图(定理)');
subplot(2, 3, 6);  imshow(img_lap_conv);  title('Laplacian 滤波图(conv2)');

结果显示:
在这里插入图片描述
进一步查看图像矩阵像素的灰度值,以 Laplacian 滤波图像为例:

使用定理计算的图像矩阵:
在这里插入图片描述
使用 conv2 函数计算的图像矩阵:
在这里插入图片描述
不考虑外围像素,中间绝大部分的像素灰度完全一样,但是在水平和竖直方向上均有一个像素的偏移,要想解决这个问题,我可以对代码的第 10、11 行进行一下更改:

filter_gau = filter;  filter_gau([end,1,2], [end,1,2]) = gaussian;
filter_lap = filter;  filter_lap([end,1,2], [end,1,2]) = laplacian;

将滤波器模板中心像素调到矩阵的左上角,问题就解决了。
重新 Run 代码,图片效果差不多,就不再展示了,下面看看更改后的图像矩阵:

使用定理计算的图像矩阵:
在这里插入图片描述
使用 conv2 函数计算的图像矩阵:
在这里插入图片描述
Perfect !!!

由此证明了时域(空域)卷积定理在图像中也是完全成立的。可是问题又来了,用定理做这么麻烦,为何不采用卷积函数一条命令就解决呢。其实我之前也怎么想,可是最近正在看 GP-GAN 的论文及相关代码,发现在解 Gaussian-Possian Equation 时,要对损失函数进行优化,具体的代码实现就采取了这种方式。在进行了傅里叶变换(原文中还涉及离散余弦变换,原理见 利用时域(空域)卷积定理进行图像滤波(Matlab 实现)(二))后,我们能将卷积操作转化为乘积操作,然后在频域上进行优化就能求出使损失函数最小的解析解,简直不能再巧妙了。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值