【通俗易懂系列】【图像处理】滤波器在MATLAB中的简单快速实现!以及傅!拉!Z!三大变换核心作用!

先啰嗦两句

在本文中作者根据自己的理解会对傅里叶变换,拉普拉斯变换和Z变换用简短的几句话简单描述他们的作用。而不会给出大量的数学公式证明,因为我比较懒,因为这种公式在CSDN上有很多,读者很容易可以搜索到很详细的公式推导。 本文并给出MATLAB下的各种滤波器的简单编写方式及其作用。若有错误的地方欢迎大家及时指正!

三大变换的作用

对于信号也好,图像也好,当我们想对这些东西进行处理(如滤波)时,有些时候我们不方便在时域(即正常的状态)进行处理,而是将其转化为频域(频率域滤波)下更容易处理。

这也就是傅里叶变换的作用,它帮助我们将时域下的信号或者图像等,转换到频域下。

而大家都知道傅里叶变换必须在特有条件下才能够使用,即狄里赫利条件。

想具体了解的可以去搜一下了,本文简言盖之,即十分苛刻的条件,哈哈。
因此我们的拉普拉斯变换登场了,它不用满足这个什么里又利的条件,而是直接可以将连续函数转换成复频域。

注意!以上全都是在处理连续函数,而对于离散函数,就需要我们的Z变换出场了。

即Z变换的作用是将时域信号(离散的时间序列)变换为在复频域的表达式。

Z变换在离散时间信号处理的地位如同拉普拉斯在连续时间信号处理中的地位。

四个MATLAB的核心函数

快速傅里叶操作,直接用于数字图像处理
其中x为输入图像
m和n指定了输出图像的长和宽:

I = fft2(x, m, n)

将零频移动到中心
简单理解一下就是平移之前的幅度谱四个角比较亮,平移之后是中心以及两个对称轴比较亮
其中x为输入图像
dim为平移方式,一般为1或者2或默认:

I = fftshift(x, dim)

将上一步移到中心的零频移动回去
其中的参数和上一步的参数意义相同:

I = ifftshift(x, dim)

傅里叶反变换函数
其中的参数和傅里叶变换参数意义相同:

I = ifft2(x, m, n)

一般的操作方法为:

  1. 将图片进行快速傅里叶变换
  2. 将变换好的图像的零频移至中央
  3. 将平移好的图像和过滤器进行点积操作
  4. 将图像的零频平移回去
  5. 执行傅里叶反变换恢复图像并输出

为了便于快速执行上述步骤,我们为此定义一个函数:

基本函数的定义

% 提供原始图像和与原图像等大的频域滤波器作为参数
% 返回经滤波处理又反变换的图像
function out = imff(I, ff)
% I为输入的图像
% ff为原图像等大的频域滤镜
if (ndims(I) == 3) && (size(I, 3) == 3)
	I = rgb2gray(I)
end

if (size(I) ~= size(ff))
	msg1 = sprintf('%S: 滤镜与原图像不相等', mfilename)
	msg2 = sprintf('%S: 滤波操作终止', mfilename)
	eid = sprintf('Images:%s:图片尺寸不等', mfilename)
	error(eid, '%s %S', msg1, msg2)
end

f = fft2(I) 
s = fftshift(f) 

% 应用滤镜及反变换
out = s .*ff
out = ifftshift(out)
out = ifft2(out)

out = abs(out)

out = out/max(out(:))
end

注意这个imff函数,是本文的基础。

频率域低通滤波器

% 频率域低通滤波器实现(将比截至频率高的频率全部设于0)
function out = imidealflpf(I, freq)
% freq为设定的截止频率
[M, N] = size(I)
out = ones(M, N)
for i = 1:M
	for j = 1:N
		if (sqrt(((i - M/2)^2 + (j - N/2)^2)) > freq)
			out(i, j) = 0
		end
	end
end
end

高斯低通滤波器

% 高斯低通滤波器实现
function out = imgaussflpf(I, sigma)
% sigma为高斯曲线的标准差
[M, N] = size(I)
out = ones(M, N)
for i = 1:M
	for j = 1:N
		out(i, j) = exp(-((i - M/2)^2 + (j - N/2)^2)/2/sigma^2)
		end
	end
end
end

高斯高通滤波器

% 高斯高通滤波器(滤除低频留下高频,突出细节)
function out = imgaussfhpf(I, sigma)
[M, N] = size(I)
out = ones(M, N)
for i = 1:M
	for j = 1:N
		out(i, j) = 1 - exp(-((i - M/2)^2 + (j - N/2)^2)/2/sigma^2)
		end
	end
end
end

拉普拉斯频域滤波器

% 拉普拉斯频域滤波器
function out = imlapf(I)
[M, N] = size(I)
out = ones(M, N)
for i = 1:M
	for j = 1:N
		out(i, j) = -((i - M/2)^2 + (j - N/2)^2)
		end
	end
end
end

消除周期噪声

% 消除周期噪声
function out = imgaussfbrf(I, freq, width)
% freq为阻塞频带中心频率到频率原点的距离
% width为阻塞频带宽度
[M, N] = size(I)
out = ones(M, N)
for i = 1:M
	for j = 1:N
		out(i, j) = 1 - exp(-0.5 * (((i - M/2)^2 + (j - N/2)^2 - freq^2)/(sqrt(i .^2 + j .^2) * width))^2)
		end
	end
end
end

应用举例

注意我们的基本函数和拉普拉斯频域滤波器

% 举例说明
I = imread('filename.png')

ff = imlapf(I)
out = imff(I, ff)
imshow(out)

总结

滤波器的函数定义是根据公式写下来的,每个滤波器的函数定义的推导不算难,也很容易理解。在opencv种同样也可以对图像做类似的处理,个人感觉MATLAB可能更容易理解一些,但是opencv也同样重要。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铃灵狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值