fspecial

Upload: akhmat-basori

Post on 06-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 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