您的位置:首页 > 其它

空域滤波与频域滤波

2015-06-15 11:23 561 查看
转自 http://blog.sina.com.cn/s/blog_6f57a7150100o9vo.html
针对同一幅图像,分别使用空域模板操作和在频域对其进行滤波操作,比较结果。留意一下整个流程:

一、空域

>> f=imread('gantrycrane.png');

>> imshow(f)





>> f=rgb2gray(f);%转换为灰度图

>> figure

>> imshow(f)





>> h=fspecial('sobel')%生成垂直sobel掩膜

h =

1 2 1

0 0 0

-1 -2 -1

>> freqz2(h)%查看sobel算子的频域响应图形





>> gs=imfilter(double(f),h);

>> figure

>> imshow(gs,[])





二、频域

和空域滤波有一些相同的语句,这里写出了完整过程:

>> f=imread('gantrycrane.png');

>> f=rgb2gray(f);

>> h=fspecial('sobel')

>> PQ=paddedsize(size(f))%获取填充尺寸

PQ =

528 800

>> H=freqz2(h,PQ(1),PQ(2));%获得sobel算子的频域响应,但不会显示图形

>> H1=ifftshift(H);%重排数据序列,以使频域变换的原点位于频率矩形的左上角(因为freqz2产生的频域响应原点默认在频率矩形中心!) ——①

>> gf=dftfilt(f,H1);%频域滤波 ——②

>> figure

>> imshow(gf,[])





三、分析及比较

关于语句①:

关于H和H1的关系

>> subplot(121)

>> imshow(abs(H),[])

>> subplot(122)

>> imshow(abs(H1),[])





透视图观察:

>> subplot(121),freqz2(h,PQ(1),PQ(2))

>> H=freqz2(h,PQ(1),PQ(2));

>> subplot(122),freqz2(ifft2(H),PQ(1),PQ(2))





关于语句②:


详细执行过程

>> F=fft2(f,size(H1,1),size(H1,2));%size(H1,1)即PQ(1),size(H1,2)即PQ(2)

>> g=real(ifft2(H.*F));%频域相乘再IFT

>> gf=g(1:size(f,1),1:size(f,2));%截取图像左上角

结果一样。

具体流程参前面博文:中流程图

比较:

>> d=abs(gs-gf);%gs、gf分别为空域和频域产生的滤波后的图像

>> max(d(:))

ans =

3.4106e-013

>> min(d(:))

ans =

0

可看见,差异很小。产生原因:频域操作中FFT和IFT中由于复数的存在产生的舍入误差。(空域操作中不产生复数)。故结论:使用空间域滤波和频域滤波得到的图像对所有实用目的来说,都是相同的。

四、扩展

上述垂直sobel掩膜近似为垂直的梯度,将其旋转,看看水平算子的滤波效果。

>> h=h'

h =

1 0 -1

2 0 -2

1 0 -1

其他处理一样,滤波结果为:





结论:垂直sobel算子有助于增强(突出)水平边缘;水平sobel算子有助于增强(突出)垂直边缘。

//继续修改可以得到可以同时增强水平和垂直边缘的SOBEL算子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: