www.gusucode.com > 一个虹膜识别的Matlab程序源码 > Segmentation/addcircle.m

    % ADDCIRCLE
%
% A circle generator for adding (drawing) weights into a Hough accumumator
% array.
%
% Usage:  h = addcircle(h, c, radius, weight)
% 
% Arguments:
%            h      - 2D accumulator array.
%            c      - [x,y] coords of centre of circle.
%            radius - radius of the circle
%            weight - optional weight of values to be added to the
%                     accumulator array (defaults to 1)
%
% Returns:   h - Updated accumulator array.

% Peter Kovesi
% Department of Computer Science & Software Engineering
% The University of Western Australia
% April 2002

function h = addcircle(h, c, radius, weight)

    [hr, hc] = size(h);
    
    if nargin == 3
	weight = 1;
    end
    
    % c and radius must be integers
    if any(c-fix(c))
	error('Circle centre must be in integer coordinates');
    end
    
    if radius-fix(radius)
	error('Radius must be an integer');
    end
    
    x = 0:fix(radius/sqrt(2));
    costheta = sqrt(1 - (x.^2 / radius^2));
    y = round(radius*costheta);
    
    % Now fill in the 8-way symmetric points on a circle given coords 
    % [px py] of a point on the circle.
    
    px = c(2) + [x  y  y  x -x -y -y -x];
    py = c(1) + [y  x -x -y -y -x  x  y];

    % Cull points that are outside limits
    validx = px>=1 & px<=hr;
    validy = py>=1 & py<=hc;    
    valid = find(validx & validy);

    px = px(valid);
    py = py(valid);
    
    ind = px+(py-1)*hr;
    h(ind) = h(ind) + weight;