图像空间域处理——matlab滤波API封装重写

前两天花时间重新把matlab图像预处理的函数重新封装了一下

下面直接上代码吧!

%{
matlab函数重载
nargin 
为调用函数时输入的参数个数,在 MATLAB 中不需要定义时的参数与调用时的参数个数相同,即定义参数(x,y)但是调用时可以只输入参数 x
特别注意在类的方法中,obj 参数虽然在调用时并不用写,但是也算一个参数
varargin
输入的参数可以只用一个 varargin 表示,然后调用时输入的参数都在这个 varargin 元胞数组中,用 varargin{1} 即可获得第一个输入参数
使用para=[1 2 3]可用一个自定义的参数列表一起传入多个参数
%}
function outImg = myImgFilter(imgFile,type,para,boundary_padding,filtering_method,self_define_filter)
%
%MYIMGFILTER:输入需要任意格式过滤的原图像和过滤方式,输出滤波后的图
%outImg = myImgFilter(imgFile,type,hSize,boundary_padding,filtering_method,self_define_filter)
%输入:imgFile:要滤波的图像,type:滤波的类型,hSize:滤波器尺寸,boundary_padding:边界填充方式,
%filtering_method:相关或卷积过滤,self_define_filter:自定义卷积核
%输出:outImg:滤波后的图像
%函数:h = fspecial(type,para) ,其中type指定算子的类型,para指定相应的参数;
%H =FSPECIAL('average',HSIZE) 均值滤波器,hsize为矩阵尺寸,默认3;
%H =FSPECIAL('disk',RADIUS) 圆形区域均值滤波,radius为半径,默认5;
%H =FSPECIAL('gaussian',HSIZE,SIGMA) 高斯低通滤波器,hsize表示模板尺寸,默认值为[3 3],sigma为滤波器的标准差,单位为像素,默认值为0.5.
%H = FSPECIAL('laplacian',ALPHA)  近似二维拉普拉斯运算滤波器,alpha用于控制算子形状,取值范围为[0,1],默认值为0.2. 
%H = FSPECIAL('log',HSIZE,SIGMA)  高斯拉普拉斯(LoG)运算滤波器 ,hsize表示模板尺寸,默认值为[5 5],sigma为滤波器的标准差,单位为像素,默认值为0.5. 
%H = FSPECIAL('motion',LEN,THETA)  运动模糊算子,两个参数表示摄像物体逆时针方向以theta角度运动了len个像素,len的默认值为9,theta的默认值为0;  
%H = FSPECIAL('prewitt') 水平梯度/垂直边缘增强滤波器,用于边缘增强,大小为[3 3],无参数
%H = FSPECIAL('sobel')  水平边缘增强滤波器,用于边缘提取,无参数
%H = FSPECIAL('unsharp',ALPHA)  对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2. 
%函数:h = fspecial(type,para) ,其中type指定算子的类型,para指定相应的参数;
%函数:g = imfilter(f, w, filtering_mode, boundary_options, size_options);
%filtering_mode=‘corr’通过使用相关来完成,该值为默认.‘conv’通过使用卷积来完成。
%boundary_options=‘X’输入图像的边界通过用值X(无引号)来填充扩展,其默认值为0.‘replicate’图像大小通过复制外边界的值来扩展.
%‘symmetric’图像大小通过镜像反射其边界来扩展.‘circular’图像大小通过将图像看成是一个二维周期函数的一个周期来扩展。
%size_options=‘full’输出图像的大小与被扩展图像的大小相同‘same’.输出图像的大小与输入图像的大小相同为默认值。
%
    switch type
        case 'average'%FSPECIAL('average',HSIZE) 均值滤波器,hsize为矩阵尺寸,默认3;
            averageFilter = fspecial('average',para);
            if nargin == 3
                outImg = imfilter(imgFile,averageFilter);%filtering_method默认corr相关,boundary_padding默认边界填充0
            else
                outImg = imfilter(imgFile,averageFilter,filtering_method,boundary_padding); 
            end 
        case 'disk'%FSPECIAL('disk',RADIUS) 圆形区域均值滤波,radius为半径,默认5;
            diskFilter = fspecial('disk',para);
            outImg = imfilter(imgFile,diskFilter,filtering_method,boundary_padding); 
        case 'median'%函数medfilt2(f, [m n], padopt)
            if nargin == 3
                outImg = medfilt2(imgFile,para); %使用默认参数卷积
            else
                outImg = medfilt2(imgFile,para,boundary_padding);%全参数设置卷积
            end
        case 'gaussian'%FSPECIAL('gaussian',HSIZE,SIGMA) 高斯低通滤波器,hsize表示模板尺寸,默认值为[3 3],sigma为滤波器的标准差,单位为像素,默认值为0.5.
            if nargin == 2
                gaussianFilter = fspecial('gaussian');%默认参数卷积
                outImg = imfilter(imgFile,gaussianFilter)
            else
                gaussianFilter = fspecial('gaussian',para(1),para(2));%设置全参数卷积
                outImg = imfilter(imgFile,gaussianFilter,filtering_method,boundary_padding); 
            end
        case 'laplacian' %FSPECIAL('laplacian',ALPHA)近似二维拉普拉斯运算滤波器,alpha用于控制算子形状,取值范围为[0,1],默认值为0.2.
            laplacianFilter = fspecial('laplacian',para); 
            if nargin == 3
                outImg = imfilter(imgFile,laplacianFilter);%filtering_method默认corr相关,boundary_padding默认边界填充0
            else
                outImg = imfilter(imgFile,laplacianFilter,filtering_method,boundary_padding); 
            end 
        case 'log'%FSPECIAL('log',HSIZE,SIGMA)高斯拉普拉斯(LoG)运算滤波器 ,hsize表示模板尺寸,默认值为[5 5],sigma为滤波器的标准差,单位为像素,默认值为0.5.
            logFilter = fspecial('log',para);  
            outImg = imfilter(imgFile,logFilter,filtering_method,boundary_padding); 
        case 'motion'%FSPECIAL('motion',LEN,THETA)  运动模糊算子,两个参数表示摄像物体逆时针方向以theta角度运动了len个像素,len的默认值为9,theta的默认值为0;
            if nargin == 2
                motionFilter = fspecial('motion');
                outImg = imfilter(imgFile,motionFilter)
            else
                motionFilter = fspecial('motion',para(1),para(2));
                outImg = imfilter(imgFile,motionFilter,filtering_method,boundary_padding); 
            end
        case 'prewitt'% FSPECIAL('prewitt') 水平梯度/垂直边缘增强滤波器,用于边缘增强,大小为[3 3],无参数
            prewittFilter = fspecial('prewitt');
            if nargin == 2
                outImg = imfilter(imgFile,prewittFilter);%filtering_method默认corr相关,boundary_padding默认边界填充0
            else
                outImg = imfilter(imgFile,prewittFilter,filtering_method,boundary_padding); 
            end 
        case 'sobel'%FSPECIAL('sobel')  水平边缘增强滤波器,用于边缘提取,无参数
            sobelFilter = fspecial('sobel');
            if nargin == 2
                outImg = imfilter(imgFile,sobelFilter);%filtering_method默认corr相关,boundary_padding默认边界填充0
            else
                outImg = imfilter(imgFile,sobelFilter,filtering_method,boundary_padding); 
            end 
        case 'unsharp'%FSPECIAL('unsharp',ALPHA)  对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2. 
            if nargin == 2
                unsharpFilter = fspecial('unsharp');%默认值为0.2.
                outImg = imfilter(imgFile,unsharpFilter);%filtering_method默认corr相关,boundary_padding默认边界填充0
            elseif nargin == 3
                unsharpFilter = fspecial('unsharp',para);%使用默认参数卷积
                outImg = imfilter(imgFile,unsharpFilter);
            else
                unsharpFilter = fspecial('unsharp',para);%全参数设置卷积
                outImg = imfilter(imgFile,unsharpFilter,filtering_method,boundary_padding);
            end 
        case 'self_define'
            self_define_filter = self_define_filter;%自定义滤波矩阵
            outImg = imfilter(imgFile,self_define_filter,filtering_method,boundary_padding); 
        otherwise
            disp('滤波方式选择错误');
    end
end

下面是测试文件:

imgInFile = 'img/demo.png';
[img,grayImg] = space_processing.myImgRead(imgInFile);
aveFilterImg = myImgFilter(grayImg,'average',5,'replicate','conv');%均值滤波
meadinFilterImg = myImgFilter(grayImg,'median',[5,5],'symmetric');%中值滤波
meadinFilterImg2 = myImgFilter(grayImg,'median',[5,5]);%中值滤波
gaussianFilterImg = myImgFilter(grayImg,'gaussian',[5 0.5],'replicate','conv');%高斯低通滤波器
laplacianFilterImg = myImgFilter(grayImg,'laplacian',0.2,'replicate','conv');%近似二维拉普拉斯运算滤波器
logFilterImg = myImgFilter(grayImg,'log',5,'replicate','conv');%高斯拉普拉斯(LoG)运算滤波器 
motionFilterImg = myImgFilter(grayImg,'motion',[9 0],'replicate','conv');%运动模糊算子
prewittFilterImg = myImgFilter(grayImg,'prewitt',0,'replicate','conv');%Prewitt 水平边缘增强滤波器
sobelFilterImg = myImgFilter(grayImg,'sobel',0,'replicate','conv');%Sobel 水平边缘增强滤波器
unsharpFilterImg = myImgFilter(grayImg,'unsharp',0.2,'replicate','conv');%对比度增强滤波器
self_define_filter = ones(5)/5*5;%自定义卷积核
selfFilterImg = myImgFilter(grayImg,'self_define',0,'replicate','conv',self_define_filter);%对比度增强滤波器
figure;%图像显示窗口
space_processing.myImShow(grayImg,1,'原灰度图');
space_processing.myImShow(aveFilterImg,2,'均值滤波图');
space_processing.myImShow(meadinFilterImg,3,'中值滤波图');
space_processing.myImShow(gaussianFilterImg,4,'高斯滤波图');
space_processing.myImShow(laplacianFilterImg,5,'拉普拉斯滤波图');
space_processing.myImShow(logFilterImg,6,'高斯拉普拉斯滤波图');
figure;%图像显示窗口
space_processing.myImgShow(motionFilterImg,1,'imshow',0,'运动算子滤波图');
space_processing.myImgShow(prewittFilterImg,2,'imshow',0,'prewitt滤波图');
space_processing.myImgShow(sobelFilterImg,3,'imshow',0,'sobel滤波图');
space_processing.myImgShow(unsharpFilterImg,4,'imshow',0,'对比度增强滤波图');
space_processing.myImgShow(selfFilterImg,5,'imshow',0,'自定义滤波图');

运行结果:

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值