MATLAN图像处理之空间域生成滤波函数对图像处理(边缘检测)

先看一下整体的效果  下面例子实现了边缘检测

MATLAN图像处理之空间域生成滤波函数对图像处理(边缘检测)MATLAN图像处理之空间域生成滤波函数对图像处理(边缘检测)

 

下面通过代码来实现上述过程

%同场滤波器较小时,空间滤波器比邻域滤波器更有效
%对一个给定的空间滤波器h,生成一个频域滤波器的H的显然方法是
%H=fft2(h,PQ(1),PQ(2)),其中PQ(1)是想要滤波图像长*2  PQ(2)是想要滤波图像宽*2
%PQ的值相当于扩充后 再进行数据变换

%下面讨论两个主题
% 1 如可将空间滤波器转换为等价的频域滤波器
% 2 如何比较使用函数imfilter的空间滤波与 dft的空间滤波
%  imfilter中使用了相关,且滤波函数的远点在中心处,为了是这两种方法等同,需要预处理数据
%  freqz2  他可以完成上述工作并输出频域中的相应的滤波器
%  freqz2用于计算FIR滤波器的频率响应  
%  H=freqz2(h,r,c)
%  h是一个二维的空间滤波器  H是相应的二维频域滤波器,R为H的行数  C是H的列数
clc
clear
f=imread('D:\研究生课程\其他\MATLAB图像处理\亮度调节与空间滤波\5.jpg');
f=f(:,:,1);
subplot(2,2,2)
imshow(f)
title('原图')
F=fft2(f);
S=fftshift(log(1+(abs(F))));
S1=fftshift(abs(F));
subplot(2,2,1)
imshow(S,[])%自动调整数据范围便于显示
title('log拉伸后的频谱')
subplot(2,2,3)
imshow(uint8(S1/255))
title('没有log拉伸后的频谱')%这样在途中显得会均匀

%使用fspecial 生成空间滤波函数
h=fspecial('sobel')'
%sobel 关于增强垂直边缘的空间滤波器
figure
freqz2(h)%看sobel滤波函数的频谱
PQ=[size(f,1)*2,size(f,2)*2];
H=freqz2(h,PQ(1),PQ(2));
H1=ifftshift(H);
figure
subplot(2,1,1)
imshow(abs(H),[])
subplot(2,1,2)
imshow(abs(H1),[])

%滤波
gs=imfilter(double(f),h)%默认用0进行填充
gf=dftfilt(f,H1);%给处的频域处理
figure
subplot(3,1,1)
imshow(gs,[])
title('空间滤波')
subplot(3,1,2)
imshow(gf,[])
title('频域滤波')
subplot(3,1,3)
imshow(f,[])
title('原图')

%创建阈值二值图像  可清楚看到边缘
figure
subplot(2,1,1)
imshow((abs(gs)>0.1*abs(max(gs(:)))))
subplot(2,1,2)
imshow((abs(gf)>0.1*abs(max(gf(:)))))
%