前两天花时间重新把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,'自定义滤波图');
运行结果: