自编二维滤波函数

该博客介绍了如何编写一个二维滤波函数myfilter2来实现MATLAB中filter2函数的功能,特别是在图像边缘采用复制方式进行填充。通过选择不同的低通滤波模板,对图像进行平滑处理,并对比了自定义函数与MATLAB内置函数的效果。示例代码展示了处理过程,包括不同大小滤波核对图像边缘处理的适应性。
摘要由CSDN通过智能技术生成

1. 自编一个二维滤波函数myfilter2(H, A),实现matlab中的filter2函数的功能(边缘采用复制的方式);选择一个空域低通滤波模板,用自编的函数对某图像做平滑.

主程序:

// An highlighted block
clear;clc;
img=imread('C:\Users\87991\Desktop\实验报告\图像处理\图\circuitboard-salt.tif');
%img=rgb2gray(img);
box=[1 2 1;2 4 2;1 2 1];
box=box/sum(box(:));
[img1,img2]=myfilter2(img,box);
subplot(131),imshow(uint8(img)),title('原图');
subplot(132),imshow(uint8(img1)),title('自定义平滑');
subplot(133),imshow(uint8(img2)),title('原函数平滑')

myfilter2类:

// An highlighted block
function [img1,img2]=myfilter2(img,box)
% clear;clc;
% img=imread('C:\Users\87991\Desktop\2.jpg');
% img=rgb2gray(img);
img=double(img);
[h,w]=size(img);
%box=[1 1;2 2];   %2X2    全1
%box=[1 1 1;2 2 2;3 3 3]; %3X3  全1
%box=[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]; %4X4  全2
%box=[1 1 1 1 1;2 2 2 2 2;3 3 3 3 3;4 4 4 4 4;5 5 5 5 5]; %5X5 全2
%box=[1 2 3 4;1 2 2 4;3 3 2 1 ;]; %3X4  左 12 上下1
box=[1 2 3;1 2 2;3 3 2;1 2 1];      %4X3 左右112
box=box/sum(box(:));
str='zeros';
[n,m]=size(box);
tend_img=img;
if(mod(n,2)~=mod(m,2))                         %若模板行与列分别为偶数和奇数
    if (strcmp(str,'sample'))            
 for i=1:round((n/2))-1                        %复制填充 
    tend_img=[img(1:h);tend_img];
end
for i=1:n/2                             
    tend_img=[tend_img;img(end,:)];
end
[h,w]=size(tend_img);
for i=1:round((m/2))-1                        
    tend_img=[tend_img(1:h,1),tend_img];
end
for j=1:m/2                         
    tend_img=[tend_img,tend_img(:,end)];
end

    else                                
        for i=1:round((n/2))-1                      %零填充   
            tend_img=[zeros(1,w);tend_img];         %/行
        end
        for i=1:(n/2)                               %/行
            tend_img=[tend_img;zeros(1,w)];
        end
        [h,w]=size(tend_img);
         for i=1:round((m/2))-1                     %/列    
            tend_img=[zeros(h,1),tend_img];
        end
         for j=1:(m/2)                              %/列
            tend_img=[tend_img,zeros(h,1)]; 
         end
    end
  
elseif (strcmp(str,'sample'))               %奇数 复制填充
   
for i=1:n/2                         
    tend_img=[img(1,:);tend_img;img(end,:)];
end
for j=1:m/2                         
    tend_img=[tend_img(:,1),tend_img,tend_img(:,end)];
end
elseif(strcmp(str,'zeros'))                 %奇数 零填充
        for i=1:n/2                        
            tend_img=[zeros(1,w);tend_img;zeros(1,w)];
        end
        [r,l]=size(tend_img);
         for j=1:m/2                        
            tend_img=[zeros(r,1),tend_img,zeros(r,1)]; 
         end
end
[h,w]=size(tend_img);
for i=1:h-n+1
    for j=1:w-m+1
        c=tend_img(i:i+(n-1),j:j+(m-1));  %取模板覆盖图像
        num=c.*box;                       %覆盖区域与模板相乘
        num=round(sum(num(:)));           %相加
        img1(i,j)=num;                     
    end
end
img2=filter2(box,img);
end
% subplot(131),imshow(uint8(img)),title('原图');
% subplot(132),imshow(uint8(img1)),title('自定义平滑');
% subplot(133),imshow(uint8(img2)),title('原函数平滑');

注意点:当滤波核不为正方形时,即3X4或4X3时图像的边缘扩充会有相应变化。具体可看注释。

效果图:

原图:
在这里插入图片描述
自定义效果:
在这里插入图片描述

Matlab自带效果:
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值