§
    aÒ³gs!  ã                  ór   — d dl mZ d dlZddlmZmZ dZg d¢Zg d¢Z G d„ d	¦  «        Z	 G d
„ d¦  «        Z
dS )é    )ÚannotationsNé   )ÚImageÚ_imagingmorphi   )	é   é   r   é   é   r   é   é   é   )	r   r   r   r   r
   r   r   r	   r   c                  óN   — e Zd ZdZ	 ddd	„Zdd„Zdd„Zd d„Zd!d„Zd"d„Z	d#d„Z
dS )$Ú
LutBuilderaT  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()

    NÚpatternsúlist[str] | NoneÚop_nameú
str | NoneÚreturnÚNonec                ó°   — |�|| _         ng | _         d | _        |�;ddgdgddgdgddgg d¢dœ}||vrd	|› d
�}t          |¦  «        ‚||         | _         d S d S )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 ú!)r   ÚlutÚ	Exception)Úselfr   r   Úknown_patternsÚmsgs        úL/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/PIL/ImageMorph.pyÚ__init__zLutBuilder.__init__A   sª   € ð ÐØ$ˆDŒMˆMàˆDŒMØ%)ˆŒØÐà/Ð1EÐFØ2Ð3Ø2Ð4HÐIØ1Ð2Ø1Ð3GÐHðð ð ðð ˆNð ˜nÐ,Ð,Ø3¨Ð3Ð3Ð3�Ý ‘n”nÐ$à*¨7Ô3ˆDŒMˆMˆMð# Ðó    ú	list[str]c                ó&   — | xj         |z  c_         d S ©N©r   )r!   r   s     r$   Úadd_patternszLutBuilder.add_patterns\   s   € ØˆŒ˜Ñ!ˆŒˆˆr&   c                ó|   ‡‡— ddgŠdŠt          ˆˆfd„t          t          ¦  «        D ¦   «         ¦  «        | _        d S )Nr   r   é   c              3  ó6   •K  — | ]}‰|‰z  d k             V — ŒdS )r   N© )Ú.0ÚiÚmÚsymbolss     €€r$   ú	<genexpr>z/LutBuilder.build_default_lut.<locals>.<genexpr>b   s0   øè è € ÐKÐK°a˜W a¨!¡e¨q¢[Ô1ÐKÐKÐKÐKÐKÐKr&   )Ú	bytearrayÚrangeÚLUT_SIZEr   )r!   r2   r3   s    @@r$   Úbuild_default_lutzLutBuilder.build_default_lut_   sC   øø€ Ø�a�&ˆØˆÝÐKÐKÐKÐKÐK½5Å¹?¼?ÐKÑKÔKÑKÔKˆŒˆˆr&   úbytearray | Nonec                ó   — | j         S r)   ©r   )r!   s    r$   Úget_lutzLutBuilder.get_lutd   s	   € ØŒxˆr&   ÚpatternÚstrÚpermutationú	list[int]c                óp   ‡— t          |¦  «        dk    sJ ‚d                     ˆfd„|D ¦   «         ¦  «        S )z„string_permute takes a pattern and a permutation and returns the
        string permuted according to the permutation list.
        é	   Ú c              3  ó(   •K  — | ]}‰|         V — Œd S r)   r/   )r0   Úpr=   s     €r$   r4   z-LutBuilder._string_permute.<locals>.<genexpr>l   s'   øè è € Ð7Ð7 a�w˜q”zÐ7Ð7Ð7Ð7Ð7Ð7r&   )ÚlenÚjoin)r!   r=   r?   s    ` r$   Ú_string_permutezLutBuilder._string_permuteg   sE   ø€ õ �;ÑÔ 1Ò$Ð$Ð$Ð$Ø�wŠwÐ7Ð7Ð7Ð7¨;Ð7Ñ7Ô7Ñ7Ô7Ð7r&   Úbasic_patternÚoptionsÚbasic_resultÚintúlist[tuple[str, int]]c                óŠ  — ||fg}d|v r\|d         d         }t          d¦  «        D ]>}|                     |                      |d         d         t          ¦  «        |f¦  «         Œ?d|v rOt	          |¦  «        }|d|…         D ]5\  }}|                     |                      |t
          ¦  «        |f¦  «         Œ6d|v r†t	          |¦  «        }|d|…         D ]l\  }}|                     d	d
¦  «                             dd	¦  «                             d
d¦  «        }dt          |¦  «        z
  }|                     ||f¦  «         Œm|S )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)r6   ÚappendrH   ÚROTATION_MATRIXrF   ÚMIRROR_MATRIXÚreplacerL   )	r!   rI   rJ   rK   r   Úresr1   Únr=   s	            r$   Ú_pattern_permutezLutBuilder._pattern_permuten   sh  € ð # LÐ1Ð2ˆð �'ˆ>ˆ>Ø˜2”,˜q”/ˆCÝ˜1‘X”Xð ð �Ø—’Ø×)Ò)¨(°2¬,°q¬/½?ÑKÔKÈSÐQñô ð ð ð �'ˆ>ˆ>Ý�H‘”ˆAØ (¨¨!¨¤ð Uð U‘�˜Ø—’ ×!5Ò!5°g½}Ñ!MÔ!MÈsÐ SÑTÔTÐTÐTð �'ˆ>ˆ>Ý�H‘”ˆAØ (¨¨!¨¤ð 0ð 0‘�˜à!Ÿ/š/¨#¨sÑ3Ô3×;Ò;¸CÀÑEÔE×MÒMÈcÐSVÑWÔW�Ø�#˜c™(œ(‘l�Ø—’ ¨# Ñ/Ô/Ð/Ð/àˆr&   r5   c                óÎ  — |                       ¦   «          | j        €J ‚g }| j        D ]Ô}t          j        d|                     dd¦  «        ¦  «        }|sd|z   dz   }t          |¦  «        ‚|                     d¦  «        }|                     d¦  «        }t          |                     d	¦  «        ¦  «        }|                     d
d¦  «                             dd¦  «        }||  	                    |||¦  «        z  }ŒÕg }|D ]a}|d                              dd¦  «                             dd¦  «        }| 
                    t          j        |¦  «        |d         f¦  «         Œbt          t          ¦  «        D ]i}	t          |	¦  «        dd…         }
ddt          |
¦  «        z
  z  |
z   ddd…         }
|D ],\  }}|                     |
¦  «        rddg|         | j        |	<   Œ-Œj| j        S )zlCompile all patterns into a morphology lut.

        TBD :Build based on (file) morphlut:modify_lut
        Nz(\w*):?\s*\((.+?)\)\s*->\s*(\d)ú
rC   zSyntax error in pattern "ú"r   r   r   ú r   ú.ÚXz[01]rS   rB   rP   )r8   r   r   ÚreÚsearchrY   r    ÚgrouprL   r\   rV   Úcompiler6   r7   ÚbinrF   Úmatch)r!   r   rE   r2   r#   rJ   r=   ÚresultÚcompiled_patternsr1   Ú
bitpatternÚrs               r$   Ú	build_lutzLutBuilder.build_lutŽ   sù  € ð
 	×ÒÑ Ô Ð ØŒxÐ#Ð#Ð#Øˆð ”ð 	Hð 	HˆAÝ”	Ð<¸a¿iºiÈÈbÑ>QÔ>QÑRÔRˆAØð %Ø1°AÑ5¸Ñ;�Ý ‘n”nÐ$Ø—g’g˜a‘j”jˆGØ—g’g˜a‘j”jˆGÝ˜Ÿš ™œ‘_”_ˆFð —o’o c¨2Ñ.Ô.×6Ò6°t¸RÑ@Ô@ˆGà˜×-Ò-¨g°wÀÑGÔGÑGˆHˆHð ÐØð 	Bð 	BˆGØ˜”
×"Ò" 3¨Ñ,Ô,×4Ò4°S¸&ÑAÔAˆAØ×$Ò$¥b¤j°¡m¤m°W¸Q´ZÐ%@ÑAÔAÐAÐAõ
 •x‘”ð 	,ð 	,ˆAå˜Q™œ   œˆJØ ¥S¨¡_¤_Ñ!4Ñ5¸
ÑBÀDÀDÀbÀDÔIˆJà/ð ,ð ,‘
�˜Ø—=’= Ñ,Ô,ð ,Ø#$ a &¨¤)�D”H˜Q‘Køð,ð Œxˆr&   )NN)r   r   r   r   r   r   )r   r'   r   r   )r   r   )r   r9   )r=   r>   r?   r@   r   r>   )rI   r>   rJ   r>   rK   rL   r   rM   )r   r5   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r+   r8   r<   rH   r\   rm   r/   r&   r$   r   r      s¼   € € € € € ð!ð !ðH HLð4ð 4ð 4ð 4ð 4ð6"ð "ð "ð "ðLð Lð Lð Lð
ð ð ð ð8ð 8ð 8ð 8ðð ð ð ð@*ð *ð *ð *ð *ð *r&   r   c                  óR   — e Zd ZdZ	 	 	 ddd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dS )ÚMorphOpz*A class for binary morphological operatorsNr   r9   r   r   r   r   r   r   c                óÀ   — || _         |�)t          |¬¦  «                             ¦   «         | _         dS |�)t          |¬¦  «                             ¦   «         | _         dS dS )z&Create a binary morphological operatorN)r   r*   )r   r   rm   )r!   r   r   r   s       r$   r%   zMorphOp.__init__¾   sc   € ð ˆŒØÐÝ!¨'Ð2Ñ2Ô2×<Ò<Ñ>Ô>ˆDŒHˆHˆHØÐ!Ý!¨8Ð4Ñ4Ô4×>Ò>Ñ@Ô@ˆDŒHˆHˆHð "Ð!r&   ÚimageúImage.Imageútuple[int, Image.Image]c                óJ  — | j         €d}t          |¦  «        ‚|j        dk    rd}t          |¦  «        ‚t	          j        |j        |j        d¦  «        }t          j        t          | j         ¦  «        | 
                    ¦   «         | 
                    ¦   «         ¦  «        }||fS )z‡Run 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!   ru   r#   ÚoutimageÚcounts        r$   r€   zMorphOp.applyË   sŠ   € ð
 Œ8ÐØ&ˆCÝ˜C‘.”.Ð àŒ:˜ÒÐØ(ˆCÝ˜S‘/”/Ð!Ý”9˜UœZ¨¬°TÑ:Ô:ˆÝÔ#¥E¨$¬(¡O¤O°U·[²[±]´]ÀHÇNÂNÑDTÔDTÑUÔUˆØ�hˆÐr&   úlist[tuple[int, int]]c                óÜ   — | j         €d}t          |¦  «        ‚|j        dk    rd}t          |¦  «        ‚t	          j        t          | j         ¦  «        |                     ¦   «         ¦  «        S )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`.Nry   rz   r{   )r   r    r|   r}   r   rh   r�   r‚   ©r!   ru   r#   s      r$   rh   zMorphOp.matchÛ   s^   € ð Œ8ÐØ&ˆCÝ˜C‘.”.Ð àŒ:˜ÒÐØ(ˆCÝ˜S‘/”/Ð!ÝÔ"¥5¨¬¡?¤?°E·K²K±M´MÑBÔBÐBr&   c                ó†   — |j         dk    rd}t          |¦  «        ‚t          j        |                     ¦   «         ¦  «        S )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`.rz   r{   )r|   r}   r   Úget_on_pixelsr‚   r‡   s      r$   r‰   zMorphOp.get_on_pixelsê   s;   € ð Œ:˜ÒÐØ(ˆCÝ˜S‘/”/Ð!ÝÔ*¨5¯;ª;©=¬=Ñ9Ô9Ð9r&   Úfilenamer>   c                ó  — t          |d¦  «        5 }t          |                     ¦   «         ¦  «        | _        ddd¦  «         n# 1 swxY w Y   t	          | j        ¦  «        t
          k    rd| _        d}t          |¦  «        ‚dS )z!Load an operator from an mrl fileÚrbNzWrong size operator file!)Úopenr5   Úreadr   rF   r7   r    )r!   rŠ   Úfr#   s       r$   Úload_lutzMorphOp.load_lutõ   s°   € å�(˜DÑ!Ô!ð 	+ QÝ  §¢¡¤Ñ*Ô*ˆDŒHð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+õ ˆtŒx‰=Œ=�HÒ$Ð$ØˆDŒHØ-ˆCÝ˜C‘.”.Ð ð %Ð$s   ‘'AÁAÁAc                ó¼   — | j         €d}t          |¦  «        ‚t          |d¦  «        5 }|                     | j         ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zSave an operator to an mrl fileNry   Úwb)r   r    r�   Úwrite)r!   rŠ   r#   r�   s       r$   Úsave_lutzMorphOp.save_lutÿ   s    € àŒ8ÐØ&ˆCÝ˜C‘.”.Ð Ý�(˜DÑ!Ô!ð 	 QØ�GŠG�D”HÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ©AÁAÁAc                ó   — || _         dS )z#Set the lut from an external sourceNr;   )r!   r   s     r$   Úset_lutzMorphOp.set_lut  s   € àˆŒˆˆr&   )NNN)r   r9   r   r   r   r   r   r   )ru   rv   r   rw   )ru   rv   r   r…   )rŠ   r>   r   r   )r   r9   r   r   )rn   ro   rp   rq   r%   r€   rh   r‰   r�   r”   r–   r/   r&   r$   rs   rs   »   s¿   € € € € € Ø4Ð4ð !%Ø"Ø%)ð	Að Að Að Að Aðð ð ð ð Cð Cð Cð Cð	:ð 	:ð 	:ð 	:ð!ð !ð !ð !ðð ð ð ðð ð ð ð ð r&   rs   )Ú
__future__r   rc   rC   r   r   r7   rW   rX   r   rs   r/   r&   r$   ú<module>r˜      sÎ   ðð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	à "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à€ðð ð €ð
ð ð €ð[ð [ð [ð [ð [ñ [ô [ð [ð|Nð Nð Nð Nð Nñ Nô Nð Nð Nð Nr&   