
    9i=                         S SK rS SKJr  SSKJrJrJr  SSKJr	  SSS\R                  4S jrSS
 jrSS jrSS jr SS jrSSS\R                  \R                  S	4S jrS rg)    N)cKDTree   )_hough_circle_hough_ellipse_hough_line)_probabilistic_hough_line	   
   c                     SSK Jn  [        X@R                  S   5      nU" U UUUUS9u  pn
U	R                  S:  a	  XU	   X*   4$ U[
        R                  " / 5      [
        R                  " / 5      4$ )aj  Return peaks in a straight line Hough transform.

Identifies most prominent lines separated by a certain angle and distance
in a Hough transform. Non-maximum suppression with different sizes is
applied separately in the first (distances) and second (angles) dimension
of the Hough space to identify peaks.

Parameters
----------
hspace : ndarray, shape (M, N)
    Hough space returned by the `hough_line` function.
angles : array, shape (N,)
    Angles returned by the `hough_line` function. Assumed to be continuous.
    (`angles[-1] - angles[0] == PI`).
dists : array, shape (M,)
    Distances returned by the `hough_line` function.
min_distance : int, optional
    Minimum distance separating lines (maximum filter size for first
    dimension of hough space).
min_angle : int, optional
    Minimum angle separating lines (maximum filter size for second
    dimension of hough space).
threshold : float, optional
    Minimum intensity of peaks. Default is `0.5 * max(hspace)`.
num_peaks : int, optional
    Maximum number of peaks. When the number of peaks exceeds `num_peaks`,
    return `num_peaks` coordinates based on peak intensity.

Returns
-------
accum, angles, dists : tuple of array
    Peak values in Hough space, angles and distances.

Examples
--------
>>> from skimage.transform import hough_line, hough_line_peaks
>>> from skimage.draw import line
>>> img = np.zeros((15, 15), dtype=bool)
>>> rr, cc = line(0, 0, 14, 14)
>>> img[rr, cc] = 1
>>> rr, cc = line(0, 14, 14, 0)
>>> img[cc, rr] = 1
>>> hspace, angles, dists = hough_line(img)
>>> hspace, angles, dists = hough_line_peaks(hspace, angles, dists)
>>> len(angles)
2

   _prominent_peaksr   min_xdistancemin_ydistance	threshold	num_peaksr   )feature.peakr   minshapesizenparray)hspaceanglesdistsmin_distance	min_angler   r   r   hads              a/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/transform/hough_transform.pyhough_line_peaksr#      sr    r 0I||A/I"GA! 	vvz!9eh''288B<"..    Fc                     [         R                  " [         R                  " U5      5      n[        XR	                  [         R
                  5      X#S9$ )ad  Perform a circular Hough transform.

Parameters
----------
image : ndarray, shape (M, N)
    Input image with nonzero values representing edges.
radius : scalar or sequence of scalars
    Radii at which to compute the Hough transform.
    Floats are converted to integers.
normalize : boolean, optional
    Normalize the accumulator with the number
    of pixels used to draw the radius.
full_output : boolean, optional
    Extend the output size by twice the largest
    radius in order to detect centers outside the
    input picture.

Returns
-------
H : ndarray, shape (radius index, M + 2R, N + 2R)
    Hough transform accumulator for each radius.
    R designates the larger radius if full_output is True.
    Otherwise, R = 0.

Examples
--------
>>> from skimage.transform import hough_circle
>>> from skimage.draw import circle_perimeter
>>> img = np.zeros((100, 100), dtype=bool)
>>> rr, cc = circle_perimeter(25, 35, 23)
>>> img[rr, cc] = 1
>>> try_radii = np.arange(5, 50)
>>> res = hough_circle(img, try_radii)
>>> ridx, r, c = np.unravel_index(np.argmax(res), res.shape)
>>> r, c, try_radii[ridx]
(25, 35, 23)

)	normalizefull_output)r   
atleast_1dasarrayr   astypeintp)imageradiusr&   r'   s       r"   hough_circler.   Q   s;    N ]]2::f-.F}}RWW% r$   c                     [        U UUUUS9$ )a  Perform an elliptical Hough transform.

Parameters
----------
image : (M, N) ndarray
    Input image with nonzero values representing edges.
threshold : int, optional
    Accumulator threshold value. A lower value will return more ellipses.
accuracy : double, optional
    Bin size on the minor axis used in the accumulator. A higher value
    will return more ellipses, but lead to a less precise estimation of
    the minor axis lengths.
min_size : int, optional
    Minimal major axis length.
max_size : int, optional
    Maximal minor axis length.
    If None, the value is set to half of the smaller
    image dimension.

Returns
-------
result : ndarray with fields [(accumulator, yc, xc, a, b, orientation)].
    Where ``(yc, xc)`` is the center, ``(a, b)`` the major and minor
    axes, respectively. The `orientation` value follows the
    `skimage.draw.ellipse_perimeter` convention.

Examples
--------
>>> from skimage.transform import hough_ellipse
>>> from skimage.draw import ellipse_perimeter
>>> img = np.zeros((25, 25), dtype=np.uint8)
>>> rr, cc = ellipse_perimeter(10, 10, 6, 8)
>>> img[cc, rr] = 1
>>> result = hough_ellipse(img, threshold=8)
>>> result.tolist()
[(10, 10.0, 10.0, 8.0, 6.0, 0.0)]

Notes
-----
Potential ellipses in the image are characterized by their major and
minor axis lengths. For any pair of nonzero pixels in the image that
are at least half of `min_size` apart, an accumulator keeps track of
the minor axis lengths of potential ellipses formed with all the
other nonzero pixels. If any bin (with `bin_size = accuracy * accuracy`)
in the histogram of those accumulated minor axis lengths is above
`threshold`, the corresponding ellipse is added to the results.

A higher `accuracy` will therefore lead to more ellipses being found
in the image, at the cost of a less precise estimation of the minor
axis length.

References
----------
.. [1] Xie, Yonghong, and Qiang Ji. "A new efficient ellipse detection
       method." Pattern Recognition, 2002. Proceedings. 16th International
       Conference on. Vol. 2. IEEE, 2002
)r   accuracymin_sizemax_size)r   )r,   r   r0   r1   r2   s        r"   hough_ellipser3   ~   s!    t  r$   c                     U R                   S:w  a  [        S5      eUc:  [        R                  " [        R                  * S-  [        R                  S-  SSS9n[        XS9$ )a  Perform a straight line Hough transform.

Parameters
----------
image : (M, N) ndarray
    Input image with nonzero values representing edges.
theta : ndarray of double, shape (K,), optional
    Angles at which to compute the transform, in radians.
    Defaults to a vector of 180 angles evenly spaced in the
    range [-pi/2, pi/2).

Returns
-------
hspace : ndarray of uint64, shape (P, Q)
    Hough transform accumulator.
angles : ndarray
    Angles at which the transform is computed, in radians.
distances : ndarray
    Distance values.

Notes
-----
The origin is the top left corner of the original image.
X and Y axis are horizontal and vertical edges respectively.
The distance is the minimal algebraic distance from the origin
to the detected line.
The angle accuracy can be improved by decreasing the step size in
the `theta` array.

Examples
--------
Generate a test image:

>>> img = np.zeros((100, 150), dtype=bool)
>>> img[30, :] = 1
>>> img[:, 65] = 1
>>> img[35:45, 35:50] = 1
>>> for i in range(90):
...     img[i, i] = 1
>>> rng = np.random.default_rng()
>>> img += rng.random(img.shape) > 0.95

Apply the Hough transform:

>>> out, angles, d = hough_line(img)
r   #The input image `image` must be 2D.   Fendpoint)theta)ndim
ValueErrorr   linspacepir   )r,   r9   s     r"   
hough_liner>      sR    ^ zzQ>??}RUUFQJ	3Gu**r$   c           	          U R                   S:w  a  [        S5      eUc:  [        R                  " [        R                  * S-  [        R                  S-  SSS9n[        U UUUUUS9$ )a  Return lines from a progressive probabilistic line Hough transform.

Parameters
----------
image : ndarray, shape (M, N)
    Input image with nonzero values representing edges.
threshold : int, optional
    Threshold
line_length : int, optional
    Minimum accepted length of detected lines.
    Increase the parameter to extract longer lines.
line_gap : int, optional
    Maximum gap between pixels to still form a line.
    Increase the parameter to merge broken lines more aggressively.
theta : ndarray of dtype, shape (K,), optional
    Angles at which to compute the transform, in radians.
    Defaults to a vector of 180 angles evenly spaced in the
    range [-pi/2, pi/2).
rng : {`numpy.random.Generator`, int}, optional
    Pseudo-random number generator.
    By default, a PCG64 generator is used (see :func:`numpy.random.default_rng`).
    If `rng` is an int, it is used to seed the generator.

Returns
-------
lines : list
  List of lines identified, lines in format ((x0, y0), (x1, y1)),
  indicating line start and end.

References
----------
.. [1] C. Galamhos, J. Matas and J. Kittler, "Progressive probabilistic
       Hough transform for line detection", in IEEE Computer Society
       Conference on Computer Vision and Pattern Recognition, 1999.
r   r5   r6   Fr7   )r   line_lengthline_gapr9   rng)r:   r;   r   r<   r=   _prob_hough_line)r,   r   r@   rA   r9   rB   s         r"   probabilistic_hough_linerD      sf    N zzQ>??}RUUFQJ	3G r$   c           	      Z   SSK Jn  / n	/ n
/ n/ n[        X5       Hd  u  pU" UUUUUS9u  nnnU	R                  U4[	        U5      -  5        U
R                  U5        UR                  U5        UR                  U5        Mf     [
        R                  " U	5      n	[
        R                  " U
5      n
[
        R                  " U5      n[
        R                  " U5      nU(       a  [
        R                  " X-  5      nO[
        R                  " U5      nUU   SSS2   U
U   SSS2   UU   SSS2   U	U   SSS2   4u  nnnnU[
        R                  :X  a  [	        U5      OUnUS:X  a  US:X  d  [	        U5      S:X  a  USU USU USU USU 4$ [        UUX#U5      nUU   UU   UU   UU   4$ )a  Return peaks in a circle Hough transform.

Identifies most prominent circles separated by certain distances in given
Hough spaces. Non-maximum suppression with different sizes is applied
separately in the first and second dimension of the Hough space to
identify peaks. For circles with different radius but close in distance,
only the one with highest peak is kept.

Parameters
----------
hspaces : (M, N, P) array
    Hough spaces returned by the `hough_circle` function.
radii : (M,) array
    Radii corresponding to Hough spaces.
min_xdistance : int, optional
    Minimum distance separating centers in the x dimension.
min_ydistance : int, optional
    Minimum distance separating centers in the y dimension.
threshold : float, optional
    Minimum intensity of peaks in each Hough space.
    Default is `0.5 * max(hspace)`.
num_peaks : int, optional
    Maximum number of peaks in each Hough space. When the
    number of peaks exceeds `num_peaks`, only `num_peaks`
    coordinates based on peak intensity are considered for the
    corresponding radius.
total_num_peaks : int, optional
    Maximum number of peaks. When the number of peaks exceeds `num_peaks`,
    return `num_peaks` coordinates based on peak intensity.
normalize : bool, optional
    If True, normalize the accumulator by the radius to sort the prominent
    peaks.

Returns
-------
accum, cx, cy, rad : tuple of array
    Peak values in Hough space, x and y center coordinates and radii.

Examples
--------
>>> from skimage import transform, draw
>>> img = np.zeros((120, 100), dtype=int)
>>> radius, x_0, y_0 = (20, 99, 50)
>>> y, x = draw.circle_perimeter(y_0, x_0, radius)
>>> img[x, y] = 1
>>> hspaces = transform.hough_circle(img, radius)
>>> accum, cx, cy, rad = hough_circle_peaks(hspaces, [radius,])

Notes
-----
Circles with bigger radius have higher peaks in Hough space. If larger
circles are preferred over smaller ones, `normalize` should be False.
Otherwise, circles will be returned in the order of decreasing voting
number.
r   r   r   Nr   r   )
r   r   zipextendlenr   r   argsortinflabel_distant_points)hspacesradiir   r   r   r   total_num_peaksr&   r   rcxcyaccumradhph_px_py_psaccum_sorted	cx_sorted	cy_sortedr_sortedtnpshould_keeps                            r"   hough_circle_peaksr`   1  s   B 0
A	B	BEu&(''
S# 	
##c("#
		#
		#S ' 	A	"B	"BHHUOEJJuy!JJua2
1dd
1dd	!TrT
	40L)Y  /"&&8#l
oC
 	}1c,6G16LTc"IdsOYt_htPSnUU '9mCK 	[!++	 r$   c                    [         R                  " [        U 5      [        S9n[         R                  " X/SS9n[        U5      nSn[        [        U 5      5       H  n	X:  a  SXY'   M  XY   (       a  M  UR                  X	   X   4[         R                  " X#5      5      n
U
 HJ  n[        X   X	   -
  5      U:*  n[        X   X   -
  5      U:*  nU(       d  M6  U(       d  M?  X:  d  MF  SX['   ML     US-  nM     U) nU$ )a{  Keep points that are separated by certain distance in each dimension.

The first point is always accepted and all subsequent points are selected
so that they are distant from all their preceding ones.

Parameters
----------
xs : array, shape (M,)
    X coordinates of points.
ys : array, shape (M,)
    Y coordinates of points.
min_xdistance : int
    Minimum distance separating points in the x dimension.
min_ydistance : int
    Minimum distance separating points in the y dimension.
max_points : int
    Max number of distant points to keep.

Returns
-------
should_keep : array of bool
    A mask array for distant points to keep.
)dtyper   )axisr   T)
r   zerosrI   boolstackr   rangequery_ball_pointhypotabs)xsysr   r   
max_pointsis_neighborcoordinateskd_treen_ptsineighbors_inix_closey_closer_   s                  r"   rL   rL     s    0 ((3r7$/K((B8!,Kk"GE3r7^!KN "22 FK "bfrun->bfrun->7ww26&*KO	 "
 QJE! " ,Kr$   )TF)   r   rw   N)N)r
   2   r
   NN)numpyr   scipy.spatialr   _hough_transformr   r   r   r   rC   rK   r#   r.   r3   r>   rD   r`   rL    r$   r"   <module>r}      su     ! H H K ffF/R*Z@F6+t GK4t ffFFvr/r$   