ó
    Å“,jrR  ã                   ó†   • S r SSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJrJr  SS	 jrSS
 jrSS jrS r    SS jrg)z)
Methods to characterize image textures.
é    Né   )Úcheck_nD)Úgray2rgb)Úimg_as_floaté   )Ú
_glcm_loopÚ_local_binary_patternÚ_multiblock_lbpc                 ób  • [        U S5        [        USS5        [        USS5        [        R                  " U 5      n U R                  5       n[        R                  " U R
                  [        R                  5      (       a  [        S5      eU R
                  [        R                  [        R                  4;  a  Uc  [        S5      e[        R                  " U R
                  [        R                  5      (       a)  [        R                  " U S:  5      (       a  [        S5      eUc  S	nXc:¼  a  [        S
5      e[        R                  " U[        R                  S9n[        R                  " U[        R                  S9n[        R                  " X3[        U5      [        U5      4[        R                  SS9n[!        XX#U5        U(       a  [        R"                  " US5      nXx-   nU(       a@  UR%                  [        R                  5      n[        R&                  " USSS9n	SX™S:H  '   Xy-  nU$ )aÂ  Calculate the gray-level co-occurrence matrix.

A gray level co-occurrence matrix is a histogram of co-occurring
grayscale values at a given offset over an image.

.. versionchanged:: 0.19
           `greymatrix` was renamed to `graymatrix` in 0.19.

Parameters
----------
image : array_like
    Integer typed input image. Only positive valued images are supported.
    If type is other than uint8, the argument `levels` needs to be set.
distances : array_like
    List of pixel pair distance offsets.
angles : array_like
    List of pixel pair angles in radians.
levels : int, optional
    The input image should contain integers in [0, `levels`-1],
    where levels indicate the number of gray-levels counted
    (typically 256 for an 8-bit image). This argument is required for
    16-bit images or higher and is typically the maximum of the image.
    As the output matrix is at least `levels` x `levels`, it might
    be preferable to use binning of the input image rather than
    large values for `levels`.
symmetric : bool, optional
    If True, the output matrix `P[:, :, d, theta]` is symmetric. This
    is accomplished by ignoring the order of value pairs, so both
    (i, j) and (j, i) are accumulated when (i, j) is encountered
    for a given offset. The default is False.
normed : bool, optional
    If True, normalize each matrix `P[:, :, d, theta]` by dividing
    by the total number of accumulated co-occurrences for the given
    offset. The elements of the resulting matrix sum to 1. The
    default is False.

Returns
-------
P : 4-D ndarray
    The gray-level co-occurrence histogram. The value
    `P[i,j,d,theta]` is the number of times that gray-level `j`
    occurs at a distance `d` and at an angle `theta` from
    gray-level `i`. If `normed` is `False`, the output is of
    type uint32, otherwise it is float64. The dimensions are:
    levels x levels x number of distances x number of angles.

References
----------
.. [1] M. Hall-Beyer, 2007. GLCM Texture: A Tutorial
       https://prism.ucalgary.ca/handle/1880/51900
       DOI:`10.11575/PRISM/33280`
.. [2] R.M. Haralick, K. Shanmugam, and I. Dinstein, "Textural features for
       image classification", IEEE Transactions on Systems, Man, and
       Cybernetics, vol. SMC-3, no. 6, pp. 610-621, Nov. 1973.
       :DOI:`10.1109/TSMC.1973.4309314`
.. [3] M. Nadler and E.P. Smith, Pattern Recognition Engineering,
       Wiley-Interscience, 1993.
.. [4] Wikipedia, https://en.wikipedia.org/wiki/Co-occurrence_matrix


Examples
--------
Compute 4 GLCMs using 1-pixel distance and 4 different angles. For example,
an angle of 0 radians refers to the neighboring pixel to the right;
pi/4 radians to the top-right diagonal neighbor; pi/2 radians to the pixel
above, and so forth.

>>> image = np.array([[0, 0, 1, 1],
...                   [0, 0, 1, 1],
...                   [0, 2, 2, 2],
...                   [2, 2, 3, 3]], dtype=np.uint8)
>>> result = graycomatrix(image, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4],
...                       levels=4)
>>> result[:, :, 0, 0]
array([[2, 2, 1, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 1],
       [0, 0, 0, 1]], dtype=uint32)
>>> result[:, :, 0, 1]
array([[1, 1, 3, 0],
       [0, 1, 1, 0],
       [0, 0, 0, 2],
       [0, 0, 0, 0]], dtype=uint32)
>>> result[:, :, 0, 2]
array([[3, 0, 2, 0],
       [0, 2, 2, 0],
       [0, 0, 1, 2],
       [0, 0, 0, 0]], dtype=uint32)
>>> result[:, :, 0, 3]
array([[2, 0, 0, 0],
       [1, 1, 2, 0],
       [0, 0, 2, 1],
       [0, 0, 0, 0]], dtype=uint32)

r   r   Ú	distancesÚanglesz^Float images are not supported by graycomatrix. Convert the image to an unsigned integer type.z{The levels argument is required for data types other than uint8. The resulting matrix will be at least levels ** 2 in size.r   z)Negative-valued images are not supported.é   zUThe maximum grayscale value in the image should be smaller than the number of levels.©ÚdtypeÚC)r   Úorder)r   r   r   é   ©r   r   T©ÚaxisÚkeepdims)r   ÚnpÚascontiguousarrayÚmaxÚ
issubdtyper   ÚfloatingÚ
ValueErrorÚuint8Úint8ÚsignedintegerÚanyÚfloat64ÚzerosÚlenÚuint32r   Ú	transposeÚastypeÚsum)
Úimager   r   ÚlevelsÚ	symmetricÚnormedÚ	image_maxÚPÚPtÚ	glcm_sumss
             Ú¥C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\skimage/feature/texture.pyÚgraycomatrixr2      s¼  € ô@ ˆU�AÔÜˆY˜˜;Ô'ÜˆV�Q˜Ô!ä× Ò  Ó'€Eà—	‘	“€Iä	‡}‚}�U—[‘[¤"§+¡+×.Ñ.Üð=ó
ð 	
ð ‡{�{œ2Ÿ8™8¤R§W¡WÐ-Ó-°&±.Üð)ó
ð 	
ô 
‡}‚}�U—[‘[¤"×"2Ñ"2×3Ñ3¼¿º¸uÀq¹y×8IÑ8IÜÐDÓEÐEà�~ØˆàÓÜð1ó
ð 	
ô
 ×$Ò$ Y´b·j±jÑA€IÜ×!Ò! &´·
±
Ñ;€Fä
�ŠØ	œ˜Y›¬¨V«Ð5¼R¿Y¹YÈcñ	€Aô
 ˆu °Ô3ö Ü�\Š\˜!˜\Ó*ˆØ‰Fˆö Ø�H‰H”R—Z‘ZÓ ˆÜ—F’F˜1 6°DÑ9ˆ	Ø$%ˆ	˜q‘.Ñ!Ø	‰ˆà€Hó    c                 ó¢  ^ ^• U U4S jn[        T SS5        T R                  u  mp4nTU:w  a  [        S5      eUS::  a  [        S5      eUS::  a  [        S5      eT R                  [        R
                  5      m [        R                  " T SS	S
9nSXfS:H  '   T U-  m [        R                  ST2ST24   u  pxUS:X  a  Xx-
  S-  n	OHUS:X  a  [        R                  " Xx-
  5      n	O)US:X  a  SSXx-
  S-  -   -  n	OUS;   a  O[        U S35      eUS:X  a0  [        R                  " T S-  SS9n
[        R                  " U
5      nU$ US:X  a  [        R                  " T S-  SS9nU$ US:X  a  U" 5       u  pËU$ US:X  a(  U" 5       u  p}[        R                  " T X}-
  S-  -  SS9nU$ US:X  a>  U" 5       u  p}[        R                  " T X}-
  S-  -  SS9n[        R                  " U5      nU$ US:X  aH  [        R                  " T T S:g  [        R                  " T 5      S9* n[        R                  " T U-  SS9nU$ US:X  Gab  [        R                  " XE4[        R
                  S9n[        R                  " [        T5      5      R                  TSSS45      n[        R                  " [        T5      5      R                  STSS45      nU[        R                  " UT -  SS9-
  nU[        R                  " UT -  SS9-
  n[        R                  " [        R                  " T US-  -  SS95      n[        R                  " [        R                  " T US-  -  SS95      n[        R                  " T UU-  -  SS9nUS:  nS	UUS:  '   SUU'   U) nUU   UU   UU   -  -  UU'   U$ US;   a-  W	R                  TTSS45      n	[        R                  " T U	-  SS9nW$ )a@	  Calculate texture properties of a GLCM.

Compute a feature of a gray level co-occurrence matrix to serve as
a compact summary of the matrix. The properties are computed as
follows:

- 'contrast': :math:`\sum_{i,j=0}^{levels-1} P_{i,j}(i-j)^2`
- 'dissimilarity': :math:`\sum_{i,j=0}^{levels-1}P_{i,j}|i-j|`
- 'homogeneity': :math:`\sum_{i,j=0}^{levels-1}\frac{P_{i,j}}{1+(i-j)^2}`
- 'ASM': :math:`\sum_{i,j=0}^{levels-1} P_{i,j}^2`
- 'energy': :math:`\sqrt{ASM}`
- 'correlation':
    .. math:: \sum_{i,j=0}^{levels-1} P_{i,j}\left[\frac{(i-\mu_i) \
              (j-\mu_j)}{\sqrt{(\sigma_i^2)(\sigma_j^2)}}\right]
- 'mean': :math:`\sum_{i=0}^{levels-1} i*P_{i}`
- 'variance': :math:`\sum_{i=0}^{levels-1} P_{i}*(i-mean)^2`
- 'std': :math:`\sqrt{variance}`
- 'entropy': :math:`\sum_{i,j=0}^{levels-1} -P_{i,j}*log(P_{i,j})`

Each GLCM is normalized to have a sum of 1 before the computation of
texture properties.

.. versionchanged:: 0.19
       `greycoprops` was renamed to `graycoprops` in 0.19.

Parameters
----------
P : ndarray
    Input array. `P` is the gray-level co-occurrence histogram
    for which to compute the specified property. The value
    `P[i,j,d,theta]` is the number of times that gray-level j
    occurs at a distance d and at an angle theta from
    gray-level i.
prop : {'contrast', 'dissimilarity', 'homogeneity', 'energy',             'correlation', 'ASM', 'mean', 'variance', 'std', 'entropy'}, optional
    The property of the GLCM to compute. The default is 'contrast'.

Returns
-------
results : 2-D ndarray
    2-dimensional array. `results[d, a]` is the property 'prop' for
    the d'th distance and the a'th angle.

References
----------
.. [1] M. Hall-Beyer, 2007. GLCM Texture: A Tutorial v. 1.0 through 3.0.
       The GLCM Tutorial Home Page,
       https://prism.ucalgary.ca/handle/1880/51900
       DOI:`10.11575/PRISM/33280`

Examples
--------
Compute the contrast for GLCMs with distances [1, 2] and angles
[0 degrees, 90 degrees]

>>> image = np.array([[0, 0, 1, 1],
...                   [0, 0, 1, 1],
...                   [0, 2, 2, 2],
...                   [2, 2, 3, 3]], dtype=np.uint8)
>>> g = graycomatrix(image, [1, 2], [0, np.pi/2], levels=4,
...                  normed=True, symmetric=True)
>>> contrast = graycoprops(g, 'contrast')
>>> contrast
array([[0.58333333, 1.        ],
       [1.25      , 2.75      ]])

c                  óŒ   >• [         R                  " T5      R                  TSSS45      n [         R                  " U T-  SS9nX4$ )Nr   r   ©r   )r   ÚarangeÚreshaper(   )ÚIÚmeanr.   Ú	num_levels     €€r1   Ú	glcm_meanÚgraycoprops.<locals>.glcm_meanï   s@   ø€ Ü�IŠI�iÓ ×(Ñ(¨)°Q¸¸1Ð)=Ó>ˆÜ�vŠv�a˜!‘e &Ñ)ˆØˆwˆr3   é   r.   z'num_level and num_level2 must be equal.r   znum_dist must be positive.znum_angle must be positive.r   Tr   r   Úcontrastr   ÚdissimilarityÚhomogeneityg      ð?)ÚASMÚenergyÚcorrelationÚentropyÚvariancer:   Ústdz is an invalid propertyrC   r6   rB   r:   rF   rG   rE   )ÚwhereÚoutrD   r   gVçž¯Ò<)r?   r@   rA   )r   Úshaper   r'   r   r"   r(   ÚogridÚabsÚsqrtÚlogÚ
zeros_liker#   ÚarrayÚranger8   )r.   Úpropr<   Ú
num_level2Únum_distÚ	num_angler0   r9   ÚJÚweightsÚasmÚresultsÚ_r:   ÚvarÚlnÚdiff_iÚdiff_jÚstd_iÚstd_jÚcovÚmask_0Úmask_1r;   s   `                      @r1   Úgraycopropsrd   ª   sÞ  ù€ öJô
 ˆQ��3Ôà34·7±7Ñ0€Y�
 iØ�JÓÜÐBÓCÐCØ�1ƒ}ÜÐ5Ó6Ð6Ø�Aƒ~ÜÐ6Ó7Ð7ð 	
�‰”—‘Ó€AÜ—’�q˜v°Ñ5€IØ !€I˜1‰nÑØˆ�N€Aô �8‰8�A�i�K  9 Ð,Ñ-�D€AØˆzÓØ‘5˜Q‘,‰Ø	�Ó	 Ü—&’&˜™“-‰Ø	�Ó	Ø˜ ¡¨!™|Ñ+Ñ,‰Ø	ÐWÓ	WØä˜D˜6Ð!8Ð9Ó:Ð:ð ˆxÓÜ�fŠf�Q˜‘T Ñ'ˆÜ—'’'˜#“,ˆðN €NðM 
�‹Ü—&’&˜˜A™ FÑ+ˆðJ €NðI 
�‹Ù“[‰
ˆðF €NðE 
�Ó	Ù“+‰ˆÜ—&’&˜˜q™x¨A™oÑ.°VÑ<ˆð@ €Nð? 
�‹Ù“+‰ˆÜ�fŠf�Q˜1™8¨™/Ñ*°Ñ8ˆÜ—'’'˜#“,ˆð8 €Nð7 
�Ó	Ü�fŠf�Q˜q A™v¬B¯MªM¸!Ó,<Ñ=Ð=ˆÜ—&’&˜˜R™ fÑ-ˆð2 €Nð/ 
�Ô	Ü—(’(˜HÐ0¼¿
¹
ÑCˆÜ�HŠH”U˜9Ó%Ó&×.Ñ.°	¸1¸aÀÐ/CÓDˆÜ�HŠH”U˜9Ó%Ó&×.Ñ.°°9¸aÀÐ/CÓDˆØ”R—V’V˜A ™E¨Ñ/Ñ/ˆØ”R—V’V˜A ™E¨Ñ/Ñ/ˆä—’œŸš˜q F¨q¡=Ñ0°vÑ>Ó?ˆÜ—’œŸš˜q F¨q¡=Ñ0°vÑ>Ó?ˆÜ�fŠf�Q˜& 6™/Ñ*°Ñ8ˆð ˜‘ˆØ $ˆˆu�u‰}ÑØˆ�‰ð �ˆØ˜f™+¨¨v©¸¸v¹Ñ)FÑGˆ�‰ð
 €Nð	 
Ð=Ó	=Ø—/‘/ 9¨i¸¸AÐ">Ó?ˆÜ—&’&˜˜W™¨6Ñ2ˆà€Nr3   c                 óœ  • [        U S5        [        S5      [        S5      [        S5      [        S5      [        S5      S.n[        R                  " U R                  [        R
                  5      (       a  [        R                  " S5        [        R                  " U [        R                  S	9n [        XX$UR                  5          5      nU$ )
a‹  Compute the local binary patterns (LBP) of an image.

LBP is a visual descriptor often used in texture classification.

Parameters
----------
image : (M, N) array
    2D grayscale image.
P : int
    Number of circularly symmetric neighbor set points (quantization of
    the angular space).
R : float
    Radius of circle (spatial resolution of the operator).
method : str {'default', 'ror', 'uniform', 'nri_uniform', 'var'}, optional
    Method to determine the pattern:

    ``default``
        Original local binary pattern which is grayscale invariant but not
        rotation invariant.
    ``ror``
        Extension of default pattern which is grayscale invariant and
        rotation invariant.
    ``uniform``
        Uniform pattern which is grayscale invariant and rotation
        invariant, offering finer quantization of the angular space.
        For details, see [1]_.
    ``nri_uniform``
        Variant of uniform pattern which is grayscale invariant but not
        rotation invariant. For details, see [2]_ and [3]_.
    ``var``
        Variance of local image texture (related to contrast)
        which is rotation invariant but not grayscale invariant.

Returns
-------
output : (M, N) array
    LBP image.

References
----------
.. [1] T. Ojala, M. Pietikainen, T. Maenpaa, "Multiresolution gray-scale
       and rotation invariant texture classification with local binary
       patterns", IEEE Transactions on Pattern Analysis and Machine
       Intelligence, vol. 24, no. 7, pp. 971-987, July 2002
       :DOI:`10.1109/TPAMI.2002.1017623`
.. [2] T. Ahonen, A. Hadid and M. Pietikainen. "Face recognition with
       local binary patterns", in Proc. Eighth European Conf. Computer
       Vision, Prague, Czech Republic, May 11-14, 2004, pp. 469-481, 2004.
       http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.214.6851
       :DOI:`10.1007/978-3-540-24670-1_36`
.. [3] T. Ahonen, A. Hadid and M. Pietikainen, "Face Description with
       Local Binary Patterns: Application to Face Recognition",
       IEEE Transactions on Pattern Analysis and Machine Intelligence,
       vol. 28, no. 12, pp. 2037-2041, Dec. 2006
       :DOI:`10.1109/TPAMI.2006.244`
r   ÚDÚRÚUÚNÚV)ÚdefaultÚrorÚuniformÚnri_uniformr[   zßApplying `local_binary_pattern` to floating-point images may give unexpected results when small numerical differences between adjacent pixels are present. It is recommended to use this function with images of integer dtype.r   )r   Úordr   r   r   r   ÚwarningsÚwarnr   r"   r	   Úlower)r)   r.   rg   ÚmethodÚmethodsÚoutputs         r1   Úlocal_binary_patternrv   >  s›   € ôr ˆU�AÔô �s“8Ü�3‹xÜ�s“8Ü˜3“xÜ�3‹xñ€Gô 
‡}‚}�U—[‘[¤"§+¡+×.Ñ.Ü�Šð5ô	
ô × Ò  ¬b¯j©jÑ9€EÜ" 5¨Q¸¿¹»Ñ0GÓH€FØ€Mr3   c                 óf   • [         R                  " U [         R                  S9n [        XX#U5      nU$ )a‹  Multi-block local binary pattern (MB-LBP).

The features are calculated similarly to local binary patterns (LBPs),
(See :py:meth:`local_binary_pattern`) except that summed blocks are
used instead of individual pixel values.

MB-LBP is an extension of LBP that can be computed on multiple scales
in constant time using the integral image. Nine equally-sized rectangles
are used to compute a feature. For each rectangle, the sum of the pixel
intensities is computed. Comparisons of these sums to that of the central
rectangle determine the feature, similarly to LBP.

Parameters
----------
int_image : (N, M) array
    Integral image.
r : int
    Row-coordinate of top left corner of a rectangle containing feature.
c : int
    Column-coordinate of top left corner of a rectangle containing feature.
width : int
    Width of one of the 9 equal rectangles that will be used to compute
    a feature.
height : int
    Height of one of the 9 equal rectangles that will be used to compute
    a feature.

Returns
-------
output : int
    8-bit MB-LBP feature descriptor.

References
----------
.. [1] L. Zhang, R. Chu, S. Xiang, S. Liao, S.Z. Li. "Face Detection Based
       on Multi-Block LBP Representation", In Proceedings: Advances in
       Biometrics, International Conference, ICB 2007, Seoul, Korea.
       http://www.cbsr.ia.ac.cn/users/scliao/papers/Zhang-ICB07-MBLBP.pdf
       :DOI:`10.1007/978-3-540-74549-5_2`
r   )r   r   Úfloat32r
   )Ú	int_imageÚrÚcÚwidthÚheightÚlbp_codes         r1   Úmultiblock_lbpr   Œ  s.   € ôT ×$Ò$ Y´b·j±jÑA€IÜ˜y¨Q°vÓ>€HØ€Or3   c	                 óÀ  • [         R                  " U[         R                  S9n[         R                  " U[         R                  S9n[         R                  " U 5      n	[	        U R
                  5      S:  a  [        U 5      n	[        U	5      n	Sn
[         R                  " U
5      n
U
SS2S4==   U-  ss'   U
SS2S4==   U-  ss'   X-   nX#-   n[        U
5       H�  u  pÞUu  nnX¿-   nUU-   nUSSU-
  -  -  nU(       a/  SU-
  U	UUU-   2UUU-   24   -  X†-  -   nUU	UUU-   2UUU-   24'   MT  SU-
  U	UUU-   2UUU-   24   -  X‡-  -   nUU	UUU-   2UUU-   24'   Mƒ     U	$ )aM  Multi-block local binary pattern visualization.

Blocks with higher sums are colored with alpha-blended white rectangles,
whereas blocks with lower sums are colored alpha-blended cyan. Colors
and the `alpha` parameter can be changed.

Parameters
----------
image : ndarray of float or uint
    Image on which to visualize the pattern.
r : int
    Row-coordinate of top left corner of a rectangle containing feature.
c : int
    Column-coordinate of top left corner of a rectangle containing feature.
width : int
    Width of one of 9 equal rectangles that will be used to compute
    a feature.
height : int
    Height of one of 9 equal rectangles that will be used to compute
    a feature.
lbp_code : int
    The descriptor of feature to visualize. If not provided, the
    descriptor with 0 value will be used.
color_greater_block : tuple of 3 floats
    Floats specifying the color for the block that has greater
    intensity value. They should be in the range [0, 1].
    Corresponding values define (R, G, B) values. Default value
    is white (1, 1, 1).
color_greater_block : tuple of 3 floats
    Floats specifying the color for the block that has greater intensity
    value. They should be in the range [0, 1]. Corresponding values define
    (R, G, B) values. Default value is cyan (0, 0.69, 0.96).
alpha : float
    Value in the range [0, 1] that specifies opacity of visualization.
    1 - fully transparent, 0 - opaque.

Returns
-------
output : ndarray of float
    Image with MB-LBP visualization.

References
----------
.. [1] L. Zhang, R. Chu, S. Xiang, S. Liao, S.Z. Li. "Face Detection Based
       on Multi-Block LBP Representation", In Proceedings: Advances in
       Biometrics, International Conference, ICB 2007, Seoul, Korea.
       http://www.cbsr.ia.ac.cn/users/scliao/papers/Zhang-ICB07-MBLBP.pdf
       :DOI:`10.1007/978-3-540-74549-5_2`
r   r   ))éÿÿÿÿr�   )r�   r   )r�   r   r   )r   r   )r   r   )r   r�   )r   r�   Nr   r   é   )
r   Úasarrayr"   Úcopyr$   rJ   r   r   rP   Ú	enumerate)r)   rz   r{   r|   r}   r~   Úcolor_greater_blockÚcolor_less_blockÚalpharu   Úneighbor_rect_offsetsÚcentral_rect_rÚcentral_rect_cÚelement_numÚoffsetÚoffset_rÚoffset_cÚcurr_rÚcurr_cÚhas_greater_valueÚ	new_values                        r1   Údraw_multiblock_lbpr”   »  sÈ  € ô@ Ÿ*š*Ð%8ÄÇ
Á
ÑKÐÜ—z’zÐ"2¼"¿*¹*ÑEÐô �WŠW�U‹^€Fô ˆ5�;‰;Ó˜!ÓÜ˜%“ˆô ˜&Ó!€Fð	Ðô ŸHšHÐ%:Ó;ÐØš!˜Q˜$Ó 6Ñ)ÓØš!˜Q˜$Ó 5Ñ(Óð ‘Z€NØ‘Y€Nä(Ð)>Ö?ÑˆØ#Ñˆ�(àÑ*ˆØ (Ñ*ˆà$¨¨a°+©oÑ(>Ñ?Ðö Ø˜U™ fØ˜ &™Ð(¨&°6¸E±>Ð*AÐAñ'ñ àÑ+ñ,ˆIð IRˆF�6˜F V™OÐ+¨V°f¸u±nÐ-DÐDÓEà˜U™ fØ˜ &™Ð(¨&°6¸E±>Ð*AÐAñ'ñ àÑ(ñ)ˆIð IRˆF�6˜F V™OÐ+¨V°f¸u±nÐ-DÐDÓEñ%  @ð( €Mr3   )NFF)r?   )rk   )r   )r   r   r   )r   g®Gázæ?g¸…ëQ¸î?g      à?)Ú__doc__rp   Únumpyr   Ú_shared.utilsr   Úcolorr   Úutilr   Ú_texturer   r	   r
   r2   rd   rv   r   r”   © r3   r1   Ú<module>rœ      sP   ðñó ã å $Ý Ý ß HÑ HôXôvQôhKò\,ðj Ø!Ø$Ø
õwr3   