空域滤波与频域滤波

转自 http://blog.sina.com.cn/s/blog_6f57a7150100o9vo.html

针对同一幅图像,分别使用空域模板操作和在频域对其进行滤波操作,比较结果。留意一下整个流程:

一、空域

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

>> imshow(f)

 

空域滤波与频域滤波_第1张图片

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

>> figure

>> imshow(f)

 

空域滤波与频域滤波_第2张图片

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

h =

     1     2     1

     0     0     0

    -1    -2    -1

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

 

空域滤波与频域滤波_第3张图片

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

>> figure

>> imshow(gs,[])

 

空域滤波与频域滤波_第4张图片

二、频域

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

>> 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,[])

 

空域滤波与频域滤波_第5张图片

三、分析及比较

关于语句①:

关于HH1的关系

>> subplot(121)

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

>> subplot(122)

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

 

空域滤波与频域滤波_第6张图片

透视图观察:

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

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

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

 

空域滤波与频域滤波_第7张图片

关于语句②:

详细执行过程

>> F=fft2(f,size(H1,1),size(H1,2));%size(H1,1)PQ1),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);%gsgf分别为空域和频域产生的滤波后的图像

>> max(d(:))

ans =

  3.4106e-013

>> min(d(:))

ans =

     0

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

四、扩展

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

>> h=h'

h =

     1     0    -1

     2     0    -2

     1     0    -1

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

 

空域滤波与频域滤波_第8张图片

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

//继续修改可以得到可以同时增强水平和垂直边缘的SOBEL算子。

你可能感兴趣的:(空域滤波与频域滤波)