X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fimage-1.0.15%2Fhoughtf.m;fp=octave_packages%2Fimage-1.0.15%2Fhoughtf.m;h=a6cffa928653b5ead1769bcc08eae5f12923d142;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/image-1.0.15/houghtf.m b/octave_packages/image-1.0.15/houghtf.m new file mode 100644 index 0000000..a6cffa9 --- /dev/null +++ b/octave_packages/image-1.0.15/houghtf.m @@ -0,0 +1,102 @@ +## Copyright (C) 2008 Soren Hauberg +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +## -*- texinfo -*- +## @deftypefn {Function File} @var{H} = houghtf (@var{bw}) +## @deftypefnx{Function File} @var{H} = houghtf (@var{bw}, @var{method}) +## @deftypefnx{Function File} @var{H} = houghtf (@var{bw}, @var{method}, @var{arg}) +## Perform the Hough transform for lines or circles. +## +## The @var{method} argument chooses between the Hough transform for lines and +## circles. It can be either "line" (default) or "circle". +## +## @strong{Line Detection} +## +## If @var{method} is "line", the function will compute the Hough transform for +## lines. A line is parametrised in @var{r} and @var{theta} as +## @example +## @var{r} = x*cos(@var{theta}) + y*sin(@var{theta}), +## @end example +## where @var{r} is distance between the line and the origin, while @var{theta} +## is the angle of the vector from the origin to this closest point. The result +## @var{H} is an @var{N} by @var{M} matrix containing the Hough transform. Here, +## @var{N} is the number different values of @var{r} that has been attempted. +## This is computed as @code{2*diag_length - 1}, where @code{diag_length} is +## the length of the diagonal of the input image. @var{M} is the number of +## different values of @var{theta}. These can be set through the third input +## argument @var{arg}. This must be a vector of real numbers, and is by default +## @code{pi*(-90:90)/180}. +## +## @strong{Circle Detection} +## +## If @var{method} is "circle" the function will compute the Hough transform for +## circles. The circles are parametrised in @var{r} which denotes the radius of +## the circle. The third input argument @var{arg} must be a real vector containing +## the possible values of @var{r}. +## If the input image is @var{N} by @var{M}, then the result @var{H} will be an +## @var{N} by @var{M} by @var{K} array, where @var{K} denotes the number of +## different values of @var{r}. +## +## As an example, the following shows how to compute the Hough transform for circles +## with radius 3 or 7 in the image @var{im} +## @example +## bw = edge(im); +## H = houghtf(bw, "circle", [3, 7]); +## @end example +## Here @var{H} will be an NxMx2 array, where @var{H}(:,:,1) will contain the +## Hough transform for circles with radius 3, and @var{H}(:,:,2) for radius 7. +## To find good circles you now need to find local maximas in @var{H}. If you +## find a local maxima in @var{H}(row, col, 1) it means that a good circle exists +## with center (row,col) and radius 3. One way to locate maximas is to use the +## @code{immaximas} function. +## +## @seealso{hough_line, hough_circle, immaximas} +## @end deftypefn + +function [accum, R] = houghtf(bw, varargin) + ## Default arguments + method = "line"; + args = {}; + + ## Check input arguments + if (nargin == 0) + error("houghtf: not enough input arguments"); + endif + + if (!ismatrix(bw) || ndims(bw) != 2) + error("houghtf: first arguments must be a 2-dimensional matrix"); + endif + + if (nargin > 1) + if (ischar(varargin{1})) + method = varargin{1}; + args = varargin(2:end); + else + args = varargin; + endif + endif + + ## Choose method + switch (lower(method)) + case "line" + [accum, R] = hough_line(bw, args{:}); + case "circle" + accum = hough_circle(bw, args{:}); + otherwise + error("houghtf: unsupported method '%s'", method); + endswitch + +endfunction