转自 http://blog.sina.com.cn/s/blog_6f57a7150100o9vo.html
针对同一幅图像,分别使用空域模板操作和在频域对其进行滤波操作,比较结果。留意一下整个流程:
一、空域
>> f=imread('gantrycrane.png');
>> imshow(f)
>> figure
>> imshow(f)
>> h=fspecial('sobel')%生成垂直sobel掩膜
h =
1 2 1
0 0 0
-1 -2 -1
>> freqz2(h)%查看sobel算子的频域响应图形
>> 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算子。