ó
    jñ:ir!  ã                  ód   • S SK Jr  S SKrSSKJrJr  Sr/ SQr/ SQr " S S	5      r	 " S
 S5      r
g)é    )ÚannotationsNé   )ÚImageÚ_imagingmorphi   )	é   é   r   é   é   r   é   é   é   )	r   r   r   r   r
   r   r   r	   r   c                  ó~   • \ rS rSrSr S     SS jjrSS jrSS jrSS jrSS jr	        SS	 jr
SS
 jrSrg)Ú
LutBuilderé   aü  A class for building a MorphLut from a descriptive language

The input patterns is a list of a strings sequences like these::

    4:(...
       .1.
       111)->1

(whitespaces including linebreaks are ignored). The option 4
describes a series of symmetry operations (in this case a
4-rotation), the pattern is described by:

- . or X - Ignore
- 1 - Pixel is on
- 0 - Pixel is off

The result of the operation is described after "->" string.

The default is to return the current pixel value, which is
returned if no other match is found.

Operations:

- 4 - 4 way rotation
- N - Negate
- 1 - Dummy op for no other operation (an op must always be given)
- M - Mirroring

Example::

    lb = LutBuilder(patterns = ["4:(... .1. 111)->1"])
    lut = lb.build_lut()

Nc                ó    • Ub  Xl         O/ U l         S U l        Ub3  SS/S/SS/S/SS// SQS.nX#;  a  S	U S
3n[        U5      eX2   U l         g g )Nú1:(... ... ...)->0z4:(00. 01. ...)->1z4:(... .0. .1.)->1z4:(... .0. ..1)->1z4:(... .1. .0.)->0z4:(... .1. ..0)->0)r   z4:(.0. .1. ...)->1z4:(01. .1. ...)->1)ÚcornerÚ	dilation4Ú	dilation8Úerosion4Úerosion8ÚedgezUnknown pattern Ú!)ÚpatternsÚlutÚ	Exception)Úselfr   Úop_nameÚknown_patternsÚmsgs        ÚQ/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/PIL/ImageMorph.pyÚ__init__ÚLutBuilder.__init__A   s…   € ð ÑØ$�MàˆDŒMØ%)ˆŒØÑà/Ð1EÐFØ2Ð3Ø2Ð4HÐIØ1Ð2Ø1Ð3GÐHòñˆNð Ó,Ø(¨¨	°Ð3�Ü “nÐ$à*Ñ3ˆD�Mð# ó    c                ó.   • U =R                   U-  sl         g ©N©r   )r   r   s     r!   Úadd_patternsÚLutBuilder.add_patterns\   s   € Ø�Š˜Ñ!Žr$   c                ód   ^^• SS/mSm[        UU4S j[        [        5       5       5      U l        g )Nr   r   é   c              3  ó:   >#   • U  H  nTUT-  S :„     v •  M     g7f)r   N© )Ú.0ÚiÚmÚsymbolss     €€r!   Ú	<genexpr>Ú/LutBuilder.build_default_lut.<locals>.<genexpr>b   s   øé € ÐKº?°a˜W a¨!¡e¨q¡[Ö1º?ùs   ƒ)Ú	bytearrayÚrangeÚLUT_SIZEr   )r   r0   r1   s    @@r!   Úbuild_default_lutÚLutBuilder.build_default_lut_   s'   ù€ Ø�a�&ˆØˆÜÕK¼5Ä¼?ÓKÓKˆ�r$   c                ó   • U R                   $ r&   ©r   )r   s    r!   Úget_lutÚLutBuilder.get_lutd   s   € Ø�x‰xˆr$   c                ó\   ^• [        U5      S:X  d   eSR                  U4S jU 5       5      $ )ztstring_permute takes a pattern and a permutation and returns the
string permuted according to the permutation list.
é	   Ú c              3  ó.   >#   • U  H
  nTU   v •  M     g 7fr&   r-   )r.   ÚpÚpatterns     €r!   r2   Ú-LutBuilder._string_permute.<locals>.<genexpr>l   s   øé € Ð7ª; a�w˜q–zª;ùs   ƒ)ÚlenÚjoin)r   rB   Úpermutations    ` r!   Ú_string_permuteÚLutBuilder._string_permuteg   s-   ø€ ô �;Ó 1Ó$Ð$Ð$Ø�w‰wÔ7©;Ó7Ó7Ð7r$   c                ó  • X4/nSU;   aG  US   S   n[        S5       H0  nUR                  U R                  US   S   [        5      U45        M2     SU;   a@  [	        U5      nUSU  H,  u  p…UR                  U R                  U[
        5      U45        M.     SU;   ak  [	        U5      nUSU  HW  u  p…UR                  S	S
5      R                  SS	5      R                  S
S5      nS[        U5      -
  nUR                  X…45        MY     U$ )z¹pattern_permute takes a basic pattern and its result and clones
the pattern according to the modifications described in the $options
parameter. It returns a list of all cloned patterns.Ú4éÿÿÿÿr   r
   r   ÚMNÚNÚ0ÚZÚ1)r5   ÚappendrG   ÚROTATION_MATRIXrD   ÚMIRROR_MATRIXÚreplaceÚint)	r   Úbasic_patternÚoptionsÚbasic_resultr   Úresr/   ÚnrB   s	            r!   Ú_pattern_permuteÚLutBuilder._pattern_permuten   s  € ð #Ð1Ð2ˆð �'‹>Ø˜2‘,˜q‘/ˆCÜ˜1–X�Ø—‘Ø×)Ñ)¨(°2©,°q©/¼?ÓKÈSÐQöñ ð
 �'‹>Ü�H“ˆAØ (¨¨!£‘�Ø—‘ ×!5Ñ!5°g¼}Ó!MÈsÐ SÖTñ !-ð �'‹>Ü�H“ˆAØ (¨¨!£‘�à!Ÿ/™/¨#¨sÓ3×;Ñ;¸CÀÓE×MÑMÈcÐSVÓW�Øœ#˜c›(‘l�Ø—‘  Ö/ñ	 !-ð ˆr$   c                ó†  • U R                  5         U R                  c   e/ nU R                   H¶  n[        R                  " SUR                  SS5      5      nU(       d  SU-   S-   n[        U5      eUR                  S5      nUR                  S5      n[        UR                  S	5      5      nUR                  S
S5      R                  SS5      nXR                  XeU5      -  nM¸     / nU HR  nUS   R                  SS5      R                  SS5      nUR                  [        R                  " U5      US   45        MT     [        [        5       Hb  n	[        U	5      SS n
SS[        U
5      -
  -  U
-   SSS2   n
U H1  u  pkUR!                  U
5      (       d  M  SS/U   U R                  U	'   M3     Md     U R                  $ )z\Compile all patterns into a morphology lut.

TBD :Build based on (file) morphlut:modify_lut
Nz(\w):?\s*\((.+?)\)\s*->\s*(\d)Ú
r?   zSyntax error in pattern "Ú"r   r   r   Ú r   Ú.ÚXz[01]rN   r>   rK   )r7   r   r   ÚreÚsearchrT   r   ÚgrouprU   r[   rQ   Úcompiler5   r6   ÚbinrD   Úmatch)r   r   rA   r0   r    rW   rB   ÚresultÚcompiled_patternsr/   Ú
bitpatternÚrs               r!   Ú	build_lutÚLutBuilder.build_lutŽ   s›  € ð
 	×ÑÔ Ø�x‰xÑ#Ð#Ð#Øˆð —”ˆAÜ—	’	Ð;¸Q¿Y¹YÀtÈRÓ=PÓQˆAÞØ1°AÑ5¸Ñ;�Ü “nÐ$Ø—g‘g˜a“jˆGØ—g‘g˜a“jˆGÜ˜Ÿ™ ›“_ˆFð —o‘o c¨2Ó.×6Ñ6°t¸RÓ@ˆGà×-Ñ-¨gÀÓGÑGŠHñ ð ÐÛˆGØ˜‘
×"Ñ" 3¨Ó,×4Ñ4°S¸&ÓAˆAØ×$Ñ$¤b§j¢j°£m°W¸Q±ZÐ%@ÖAñ  ô ”x–ˆAä˜Q›  ˜ˆJØ ¤S¨£_Ñ!4Ñ5¸
ÑBÁDÀbÀDÑIˆJã/‘
�Ø—=‘= ×,Ó,Ø#$ a &¨¡)�D—H‘H˜Q“Kó 0ñ !ð �x‰xˆr$   )r   r   )NN)r   úlist[str] | Noner   ú
str | NoneÚreturnÚNone)r   z	list[str]rq   rr   )rq   rr   )rq   úbytearray | None)rB   ÚstrrF   z	list[int]rq   rt   )rV   rt   rW   rt   rX   rU   rq   zlist[tuple[str, int]])rq   r4   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r"   r(   r7   r;   rG   r[   rm   Ú__static_attributes__r-   r$   r!   r   r      sl   † ñ!ðH HLð4Ø(ð4Ø:Dð4à	õ4ô6"ôLô
ô8ðØ ðØ+.ðØ>Aðà	ô÷@*r$   r   c                  óv   • \ rS rSrSr   S       SS jjrSS jrSS jrSS jrSS jr	SS	 jr
SS
 jrSrg)ÚMorphOpé»   z*A class for binary morphological operatorsNc                ó�   • Xl         Ub  [        US9R                  5       U l         gUb  [        US9R                  5       U l         gg)z&Create a binary morphological operatorN)r   r'   )r   r   rm   )r   r   r   r   s       r!   r"   ÚMorphOp.__init__¾   sD   € ð ŒØÑÜ!¨'Ñ2×<Ñ<Ó>ˆD�HØÑ!Ü!¨8Ñ4×>Ñ>Ó@ˆD�Hð "r$   c                ó\  • U R                   c  Sn[        U5      eUR                  S:w  a  Sn[        U5      e[        R
                  " UR                  UR                  S5      n[        R                  " [        U R                   5      UR                  5       UR                  5       5      nXC4$ )zwRun a single morphological operation on an image

Returns a tuple of the number of changed pixels and the
morphed imageNúNo operator loadedÚLúImage mode must be L)r   r   ÚmodeÚ
ValueErrorr   ÚnewÚsizer   ÚapplyÚbytesÚgetim)r   Úimager    ÚoutimageÚcounts        r!   rˆ   ÚMorphOp.applyË   sƒ   € ð
 �8‰8ÑØ&ˆCÜ˜C“.Ð à�:‰:˜ÓØ(ˆCÜ˜S“/Ð!Ü—9’9˜UŸZ™Z¨¯©°TÓ:ˆÜ×#Ò#¤E¨$¯(©(£O°U·[±[³]ÀHÇNÁNÓDTÓUˆØˆÐr$   c                óà   • U R                   c  Sn[        U5      eUR                  S:w  a  Sn[        U5      e[        R
                  " [        U R                   5      UR                  5       5      $ )z°Get a list of coordinates matching the morphological operation on
an image.

Returns a list of tuples of (x,y) coordinates
of all matching pixels. See :ref:`coordinate-system`.r�   r‚   rƒ   )r   r   r„   r…   r   rh   r‰   rŠ   ©r   r‹   r    s      r!   rh   ÚMorphOp.matchÛ   sY   € ð �8‰8ÑØ&ˆCÜ˜C“.Ð à�:‰:˜ÓØ(ˆCÜ˜S“/Ð!Ü×"Ò"¤5¨¯©£?°E·K±K³MÓBÐBr$   c                ó„   • UR                   S:w  a  Sn[        U5      e[        R                  " UR	                  5       5      $ )z™Get a list of all turned on pixels in a binary image

Returns a list of tuples of (x,y) coordinates
of all matching pixels. See :ref:`coordinate-system`.r‚   rƒ   )r„   r…   r   Úget_on_pixelsrŠ   r�   s      r!   r“   ÚMorphOp.get_on_pixelsê   s6   € ð �:‰:˜ÓØ(ˆCÜ˜S“/Ð!Ü×*Ò*¨5¯;©;«=Ó9Ð9r$   c                óî   • [        US5       n[        UR                  5       5      U l        SSS5        [	        U R                  5      [
        :w  a  SU l        Sn[        U5      eg! , (       d  f       N@= f)z!Load an operator from an mrl fileÚrbNzWrong size operator file!)Úopenr4   Úreadr   rD   r6   r   )r   ÚfilenameÚfr    s       r!   Úload_lutÚMorphOp.load_lutõ   s[   € ä�(˜DÔ! QÜ  §¡£Ó*ˆDŒH÷ "ô ˆt�x‰x‹=œHÓ$ØˆDŒHØ-ˆCÜ˜C“.Ð ð %÷ "Õ!ús   �A&Á&
A4c                óº   • U R                   c  Sn[        U5      e[        US5       nUR                  U R                   5        SSS5        g! , (       d  f       g= f)zSave an operator to an mrl fileNr�   Úwb)r   r   r—   Úwrite)r   r™   r    rš   s       r!   Úsave_lutÚMorphOp.save_lutÿ   sC   € à�8‰8ÑØ&ˆCÜ˜C“.Ð Ü�(˜DÔ! QØ�G‰G�D—H‘HÔ÷ "×!Ö!ús   §AÁ
Ac                ó   • Xl         g)z#Set the lut from an external sourceNr:   )r   r   s     r!   Úset_lutÚMorphOp.set_lut  s   € à�r$   r:   )NNN)r   rs   r   rp   r   ro   rq   rr   )r‹   úImage.Imagerq   ztuple[int, Image.Image])r‹   r¥   rq   zlist[tuple[int, int]])r™   rt   rq   rr   )r   rs   rq   rr   )ru   rv   rw   rx   ry   r"   rˆ   rh   r“   r›   r    r£   rz   r-   r$   r!   r|   r|   »   s_   † Ù4ð !%Ø"Ø%)ð	AàðAð ðAð #ð	Að
 
õAôô Cô	:ô!ô÷r$   r|   )Ú
__future__r   rc   r?   r   r   r6   rR   rS   r   r|   r-   r$   r!   Ú<module>r§      s<   ðõ #ã 	ç "à€ò€ò
€÷[ñ [÷|Nò Nr$   