空间域滤波:图像平滑和锐化
来源:互联网 发布:bt彗星 端口阻塞 编辑:程序博客网 时间:2024/05/22 17:45
(1)自定义一个空间域平滑滤波函数,以达到滤除指定类型噪声(如高斯噪声和椒盐噪声等)的目的,该函数的输入参数包括滤波器类型filter_type (如高斯均值滤波、中值滤波、最大/小值滤波等)、处理前的图像ima(实验图像文件名为EXP4-1.jpg和EXP4-2.jpg)以及滤波器尺寸filter_size,输出参数为滤波处理后的图像im2。
EXP4-1.jpg
EXP4-2.jpg
自定义的滤波函数:
定义一个空间域平滑滤波函数 mySpatialFilter,该函数包含滤波器类型有3x3的高斯均值滤波器、中值滤波器、最大值滤波器以及最小值滤波器。
%pho 表示输入图像的名称%filter_type 所选择的滤波器类型。有:高斯均值滤波器、中值滤波器、最大值滤波器、最小值滤波器%filter_size 定义滤波器大小,如 filter_size=[3 3];function ima2 = mySpatialFilter(pho, filter_type, filter_size)ima=imread(pho); %根据路径读取原图像ima=double(ima); %转化为双精度类型[r c]=size(ima); %读取原图像的行数和列数 if strcmp(filter_type, '高斯均值滤波器') filter_size=[3 3];endm=filter_size(1); %读取设置的滤波器模板的大小n=filter_size(2); rs=r+m-1; %计算边界填充后的图像大小(填充模板大小)cs=c+n-1;tIma=zeros(rs,cs); %创建一个边界填充后的矩阵tIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2)=ima; %矩阵中间填充原图像灰度级 %以最邻近的边界作为边界填充的灰度值%先填充上边界for i=1:(m-1)/2 tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(1);end%填充下边界for i=rs-(m-1)/2+1:rs tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(r);end%填充左边界for i=1:(n-1)/2 tIma(:,i)=tIma(:,(n-1)/2+1);end%填充右边界for i=cs-(n-1)/2+1:cs tIma(:,i)=tIma(:,cs-(n-1)/2);end rIma=zeros(rs,cs);%遍历该矩阵,套用滤波模板for i=1:rs-m+1 for j=1:cs-n+1 %读取模板覆盖处的图像 tempIma=tIma(i:i+m-1, j:j+n-1); %计算该模板覆盖的中心位置 centerR=i+(m-1)/2; centerC=j+(m-1)/2; switch filter_type case '高斯均值滤波器' %定义3 x 3的高斯均值滤波器模板 module=[1 2 1; 2 4 2; 1 2 1]; module=module(:)'; %为邻域以该模板为系数进行加权求平均,得出的值赋值得邻域中心 rIma(centerR,centerC)=module*tempIma(:)/sum(module); case '中值滤波器' %为邻域内的值排序,求得中值,将该值赋值给邻域中心 tempIma=sort(tempIma(:)); rIma(centerR,centerC)=tempIma((length(tempIma)+1)/2,1); case '最大值滤波器' %求邻域中的最大灰度值,将该值赋值给邻域中心 rIma(centerR,centerC)=max(tempIma(:)); case '最小值滤波器' %求邻域中的最小灰度值,将该值赋值给邻域中心 rIma(centerR,centerC)=min(tempIma(:)); otherwise error('不存在该滤波器'); end endend%去除原先填充的边界,得出最终结果ima2=rIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2);ima2=uint8(ima2);
定义一个使用各种滤波器对输入图像 EXP4-1.jpg 进行处理的函数 useMySpatialFilter1,输出结果。
function useMySpatialFilter1()%读取 EXP4-1.jpg图像,进行显示ima1=imread('EXP4-1.jpg');subplot(151);imshow(ima1);title('输入图像 EXP4-1.jpg'); filter_size=[3 3]; %定义滤波器的大小为 3x3type={'高斯均值滤波器' '中值滤波器' '最大值滤波器' '最小值滤波器'};tit={'3x3 高斯均值滤波器' '3x3 中值滤波器' '3x3 最大值滤波器' '3x3 最小值滤波器'};%运用各种滤波器,输出结果进行显示for i=1:4 ima2=mySpatialFilter('EXP4-1.jpg',type{i}, filter_size); subplot(1,5,i+1); imshow(ima2); title(tit(i));end
输出结果如下:
结果分析:从输入图像中我们可以看出输入图像受椒盐噪声的干扰,那么在大小3x3的邻域中,椒盐噪声体现为邻域中的最大灰度值和最小灰度值。使用中值滤波器可以滤除最大灰度值和最小灰度值,以达到去除椒盐噪声的结果。这时使用高斯均值滤波器的效果就没有比中值滤波器的效果明显。因为高斯均值使用的是不同系数加权,即可能出现椒盐噪声处处于邻域中的最大权重,使得椒盐噪声有所加强。而最大值滤波器突出显示了邻域中灰度值最大部分,尤其突出了盐粒噪声,出现更多白点。最小值滤波器突出显示了邻域中灰度值最小部分,尤其突出了胡椒噪声,出现更多黑点。
定义一个使用各种滤波器对输入图像 EXP4-2.jpg 进行处理的函数 useMySpatialFilter2,输出结果。
function useMySpatialFilter2()%读取 EXP4-2.jpg图像,进行显示ima3=imread('EXP4-2.jpg');subplot(151);imshow(ima3);title('输入图像 EXP4-2.jpg'); filter_size=[3 3];%定义滤波器的大小为 3x3type={'高斯均值滤波器' '中值滤波器' '最大值滤波器' '最小值滤波器'};tit={'3x3 高斯均值滤波器' '3x3 中值滤波器' '3x3 最大值滤波器' '3x3 最小值滤波器'};%运用各种滤波器,输出结果进行显示for i=1:4 ima2=mySpatialFilter('EXP4-2.jpg',type{i}, filter_size); subplot(1,5,i+1); imshow(ima2); title(tit(i));end
输出结果如下:
结果分析:输入图像受高斯噪声的影响,此时使用高斯均值滤波器和使用中值滤波器的处理效果相差不大。
(2)自定义一个空间域微分滤波器,要求该滤波器采用Sobel梯度算子获取输入图像的梯度图像,该滤波函数的输入参数为处理前的图像ima(实验图像文件名为EXP4-3.tif),输出参数为输入图像的梯度图像im2。
定义一个空间域微分滤波器,使用Sobel梯度算子获取输入图像的梯度图像。
mySobelGradCal
%mySobelGradCal函数使用Sobel梯度算子作为微分滤波器模板,对输入图像进行锐化操作%参数 pho 表示输入图像的路径,如 EXP4-3.tiffunction grad2=mySobelGradCal(pho)ima=imread(pho); %读取输入图像ima=double(ima); %转化为双精度类型对图像进行操作[r c]=size(ima); %获取输入的图像的行数和列数m=3; %Sobel梯度算子的梯度模板大小(行)n=3; %Sobel梯度算子的梯度模板大小(列)%边界填充后的大小rs=r+m-1;cs=c+n-1;%创建边界填充的矩阵tIma=zeros(rs,cs);%将输入图像填充在该矩阵的中心tIma((m-1)/2+1:rs-(m-1)/2,(n-1)/2+1:cs-(n-1)/2)=ima; for i=1:(m-1)/2 %为矩阵填充下边界,根据输入图像的下边界进行填充 tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(1,:); %为矩阵填充上边界,根据输入图像的上边界进行填充 tIma(rs-i-1,(n-1)/2+1:cs-(n-1)/2)=ima(r,:);end for i=1:(n-1)/2 %为矩阵填充左边界,根据矩阵已填充的左边一列进行填充 tIma(:,i)=tIma(:,(n-1)/2+1); %为矩阵填充右边界,根据矩阵已填充的右边一列进行填充 tIma(:,cs-i-1)=tIma(:,cs-(n-1)/2);end grad2=zeros(rs,cs);%以可以让Sobel梯度模板覆盖tIma对tIma进行遍历for i=1:rs-m+1 for j=1:cs-n+1 %取出当前被梯度模板覆盖的区域(灰度值)——邻域 tempIma=tIma(i:i+m-1,j:j+n-1); %求邻域的中心 centerR=i+(m-1)/2; centerC=j+(n-1)/2; %使用Sobel梯度算子进行计算 x=abs(sum([tempIma(3,:) tempIma(3,2)])-sum([tempIma(1,:) tempIma(1,2)])); y=abs(sum([tempIma(:,3); tempIma(2,3)])-sum([tempIma(:,1); tempIma(2,1)])); grad2(centerR,centerC)=x+y; endend%截取出grad2中中心部分即为输出结果grad2=grad2((m-1)/2+1:rs-(m-1)/2,(n-1)/2+1:cs-(n-1)/2);grad2=uint8(grad2);
useMySobelGradCal
%useMySobelGradCal函数显示输入图像和对输入图像应用mySobelGradCal函数后所得图像%参数pho 表示输入图像的路径,如 EXP4-3.tiffunction []=useMySobelGradCal(pho)%读取输入图像ima1=imread(pho);%显示输入图像subplot(121);imshow(ima1);title('输入图像'); %对输入图像应用mySobelGradCal函数得到Sobel梯度图像ima2=mySobelGradCal(pho);%显示Sobel梯度图像subplot(122);imshow(ima2);title('Sobel梯度图像');
输出结果如下:
需要注意的是:上述的输入图像是受噪声污染的图像,所以在使用微分滤波器前,可以先使用此前设计的滤波器合理地处理一下图像,再进行微分滤波器的处理。
- 空间域滤波:图像平滑和锐化
- 图像处理-平滑和锐化
- matlab 图像的平滑和锐化
- 数字图像处理-图像的平滑和锐化。
- 锐化空间滤波
- 图像空间域滤波
- 数字图像处理之空间域滤波和锐化(Octave实现)
- 简单的图像频域滤波和频域锐化的matlab实现
- 高斯低通滤波及图像锐化
- 中值滤波与图像锐化
- 中值滤波与图像锐化
- 高通滤波,锐化图像
- 图像平滑2-空间与低通滤波
- 图像平滑、滤波、模糊
- 图像增强--9直方图调整和 10空间域滤波
- 图像平滑处理(滤波)
- OpenCV GaussianBlur() 图像平滑滤波
- 用双边滤波图像平滑
- swift 基础(一)简单值转换、控制流、函数基础
- 利用Javascript去操作UIWebView的内容
- Java线程生命周期
- 九度oj-1464-Hello World for U
- HD_I Hate It
- 空间域滤波:图像平滑和锐化
- fastJson解析
- hdu1233 还是畅通工程
- Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)
- MIT算法导论-第二讲-渐进符号,递归及解法
- 从头认识java-10.5 栈轨迹和重新抛出异常
- 找规律小总结~
- android deamon
- Combination Sum II