Upload
akhmat-basori
View
216
Download
0
Embed Size (px)
Citation preview
8/3/2019 fspecial
1/7
1/9/12 11:21 AM C:\MATLAB7\toolbox\images\images\fspecial.m 1 of 7
function h = fspecial(varargin)
%FSPECIAL Create 2-D special filters.
% H = FSPECIAL(TYPE) creates a two-dimensional filter H of the
% specified type. Possible values for TYPE are:
%
% 'average' averaging filter
% 'disk' circular averaging filter% 'gaussian' Gaussian lowpass filter
% 'laplacian' filter approximating the 2-D Laplacian operator
% 'log' Laplacian of Gaussian filter
% 'motion' motion filter
% 'prewitt' Prewitt horizontal edge-emphasizing filter
% 'sobel' Sobel horizontal edge-emphasizing filter
% 'unsharp' unsharp contrast enhancement filter
%
% Depending on TYPE, FSPECIAL may take additional parameters
% which you can supply. These parameters all have default
% values.
%% H = FSPECIAL('average',HSIZE) returns an averaging filter H of size
% HSIZE. HSIZE can be a vector specifying the number of rows and columns in
% H or a scalar, in which case H is a square matrix.
% The default HSIZE is [3 3].
%
% H = FSPECIAL('disk',RADIUS) returns a circular averaging filter
% (pillbox) within the square matrix of side 2*RADIUS+1.
% The default RADIUS is 5.
%
% H = FSPECIAL('gaussian',HSIZE,SIGMA) returns a rotationally
% symmetric Gaussian lowpass filter of size HSIZE with standard
% deviation SIGMA (positive). HSIZE can be a vector specifying the% number of rows and columns in H or a scalar, in which case H is a
% square matrix.
% The default HSIZE is [3 3], the default SIGMA is 0.5.
%
% H = FSPECIAL('laplacian',ALPHA) returns a 3-by-3 filter
% approximating the shape of the two-dimensional Laplacian
% operator. The parameter ALPHA controls the shape of the
% Laplacian and must be in the range 0.0 to 1.0.
% The default ALPHA is 0.2.
%
% H = FSPECIAL('log',HSIZE,SIGMA) returns a rotationally symmetric
% Laplacian of Gaussian filter of size HSIZE with standard deviation% SIGMA (positive). HSIZE can be a vector specifying the number of rows
% and columns in H or a scalar, in which case H is a square matrix.
% The default HSIZE is [5 5], the default SIGMA is 0.5.
%
% H = FSPECIAL('motion',LEN,THETA) returns a filter to approximate, once
% convolved with an image, the linear motion of a camera by LEN pixels,
% with an angle of THETA degrees in a counter-clockwise direction. The
% filter becomes a vector for horizontal and vertical motions. The
% default LEN is 9, the default THETA is 0, which corresponds to a
8/3/2019 fspecial
2/7
8/3/2019 fspecial
3/7
1/9/12 11:21 AM C:\MATLAB7\toolbox\images\images\fspecial.m 3 of 7
rad = p2;
crad = ceil(rad-0.5);
[x,y] = meshgrid(-crad:crad,-crad:crad);
maxxy = max(abs(x),abs(y));
minxy = min(abs(x),abs(y));
m1 = (rad^2 < (maxxy+0.5).^2 + (minxy-0.5).^2).*(minxy-0.5) + ...
(rad^2 >= (maxxy+0.5).^2 + (minxy-0.5).^2).* ...sqrt(rad^2 - (maxxy + 0.5).^2);
m2 = (rad^2 > (maxxy-0.5).^2 + (minxy+0.5).^2).*(minxy+0.5) + ...
(rad^2 (maxxy-0.5).^2 + (minxy-0.5).^2)) | ...
((minxy==0)&(maxxy-0.5 < rad)&(maxxy+0.5>=rad))));
sgrid = sgrid + ((maxxy+0.5).^2 + (minxy+0.5).^2 < rad^2);
sgrid(crad+1,crad+1) = min(pi*rad^2,pi/2);if ((crad>0) & (rad > crad-0.5) & (rad^2 < (crad-0.5)^2+0.25))
m1 = sqrt(rad^2 - (crad - 0.5).^2);
m1n = m1/rad;
sg0 = 2*(rad^2*(0.5*asin(m1n) + 0.25*sin(2*asin(m1n)))-m1*(crad-0.5));
sgrid(2*crad+1,crad+1) = sg0;
sgrid(crad+1,2*crad+1) = sg0;
sgrid(crad+1,1) = sg0;
sgrid(1,crad+1) = sg0;
sgrid(2*crad,crad+1) = sgrid(2*crad,crad+1) - sg0;
sgrid(crad+1,2*crad) = sgrid(crad+1,2*crad) - sg0;
sgrid(crad+1,2) = sgrid(crad+1,2) - sg0;
sgrid(2,crad+1) = sgrid(2,crad+1) - sg0;end
sgrid(crad+1,crad+1) = min(sgrid(crad+1,crad+1),1);
h = sgrid/sum(sgrid(:));
case 'gaussian' % Gaussian filter
siz = (p2-1)/2;
std = p3;
[x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
arg = -(x.*x + y.*y)/(2*std*std);
h = exp(arg);
h(h
8/3/2019 fspecial
4/7
1/9/12 11:21 AM C:\MATLAB7\toolbox\images\images\fspecial.m 4 of 7
alpha = p2;
alpha = max(0,min(alpha,1));
h1 = alpha/(alpha+1); h2 = (1-alpha)/(alpha+1);
h = [h1 h2 h1;h2 -4/(alpha+1) h2;h1 h2 h1];
case 'log' % Laplacian of Gaussian
% first calculate Gaussiansiz = (p2-1)/2;
std2 = p3^2;
[x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
arg = -(x.*x + y.*y)/(2*std2);
h = exp(arg);
h(h
8/3/2019 fspecial
5/7
1/9/12 11:21 AM C:\MATLAB7\toolbox\images\images\fspecial.m 5 of 7
% unfold half-matrix to the full size
h = rot90(dist2line,2);
h(end+[1:end]-1,end+[1:end]-1) = dist2line;
h = h./(sum(h(:)) + eps*len*len);
if cosphi>0,h = flipud(h);
end
case 'prewitt' % Prewitt filter
h = [1 1 1;0 0 0;-1 -1 -1];
case 'sobel' % Sobel filter
h = [1 2 1;0 0 0;-1 -2 -1];
case 'unsharp' % Unsharp filter
alpha = p2;
h = [0 0 0;0 1 0;0 0 0] - fspecial( 'laplacian',alpha);
end
%%%
%%% ParseInputs
%%%
function [type, p2, p3] = ParseInputs(varargin)
% default values
type = '';
p2 = [];p3 = [];
% Check the number of input arguments.
checknargin(1,3,nargin,mfilename);
% Determine filter type from the user supplied string.
type = varargin{1};
type = checkstrs(type,{ 'gaussian','sobel' ,'prewitt','laplacian','log',...
'average','unsharp','disk' ,'motion'},mfilename,'TYPE',1);
% default values
switch typecase 'average'
p2 = [3 3]; % siz
case 'disk'
p2 = 5; % rad
case 'gaussian'
p2 = [3 3]; % siz
p3 = 0.5; % std
8/3/2019 fspecial
6/7
1/9/12 11:21 AM C:\MATLAB7\toolbox\images\images\fspecial.m 6 of 7
case {'laplacian', 'unsharp'}
p2 = 1/5; % alpha
case 'log'
p2 = [5 5]; % siz
p3 = 0.5; % std
case 'motion'
p2 = 9; % len
p3 = 0; % theta
end
switch nargin
case 1
% FSPECIAL('average')
% FSPECIAL('disk')
% FSPECIAL('gaussian')% FSPECIAL('laplacian')
% FSPECIAL('log')
% FSPECIAL('motion')
% FSPECIAL('prewitt')
% FSPECIAL('sobel')
% FSPECIAL('unsharp')
% Nothing to do here; the default values have
% already been assigned.
case 2
% FSPECIAL('average',N)
% FSPECIAL('disk',RADIUS)% FSPECIAL('gaussian',N)
% FSPECIAL('laplacian',ALPHA)
% FSPECIAL('log',N)
% FSPECIAL('motion',LEN)
% FSPECIAL('unsharp',ALPHA)
p2 = varargin{2};
switch type
case {'sobel','prewitt'}
msg = sprintf( '%s: Too many arguments for this type of filter.' , upper
(mfilename));
eid = sprintf( 'Images:%s:tooManyArgsForThisFilter' , mfilename);error(eid,msg);
case {'laplacian','unsharp'}
checkinput(p2,{ 'double'},{'nonnegative','real',...
'nonempty','finite','scalar'},...
mfilename, 'ALPHA',2);
if p2 > 1
msg = sprintf( '%s: ALPHA should be less than or equal 1 and greater than
0.', upper(mfilename));
eid = sprintf( 'Images:%s:outOfRangeAlpha', mfilename);
8/3/2019 fspecial
7/7
1/9/12 11:21 AM C:\MATLAB7\toolbox\images\images\fspecial.m 7 of 7
error(eid,msg);
end
case {'disk','motion'}
checkinput(p2,{ 'double'},{'positive','finite','real' ,'nonempty','scalar'},
mfilename,'RADIUS or LEN',2);
case {'gaussian','log','average'}
checkinput(p2,{ 'double'},{'positive','finite','real' ,'nonempty','integer'},mfilename,'HSIZE',2);
if prod(size(p2)) > 2
msg = 'HSIZE should have 1 or 2 elements.' ;
eid = sprintf( 'Images:%s:wrongSizeN', mfilename);
error(eid,msg);
elseif (prod(size(p2))==1)
p2 = [p2 p2];
end
end
case 3% FSPECIAL('gaussian',N,SIGMA)
% FSPECIAL('log',N,SIGMA)
% FSPECIAL('motion',LEN,THETA)
p2 = varargin{2};
p3 = varargin{3};
switch type
case 'motion'
checkinput(p2,{ 'double'},{'positive','finite','real' ,'nonempty','scalar'},
mfilename,'LEN',2);
checkinput(p3,{ 'double'},{'real','nonempty','finite','scalar'},
mfilename,'THETA',3);case {'gaussian','log'}
checkinput(p2,{ 'double'},{'positive','finite','real' ,'nonempty','integer'},
mfilename,'N',2);
checkinput(p3,{ 'double'},{'positive','finite','real' ,'nonempty','scalar'},
mfilename,'SIGMA',3);
if prod(size(p2)) > 2
msg = sprintf( '%s: size(N) should be less than or equal 2.' , upper
(mfilename));
eid = sprintf( 'Images:%s:wrongSizeN', mfilename);
error(eid,msg);
elseif (prod(size(p2))==1)
p2 = [p2 p2];end
otherwise
msg = sprintf( '%s: Too many arguments for this type of filter.' , upper
(mfilename));
eid = sprintf( 'Images:%s:tooManyArgsForThisFilter' , mfilename);
error(eid,msg);
end
end