
     fk!                    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        Q/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/PIL/ImageMorph.py__init__zLutBuilder.__init__A   s     $DMMDM%)/1EF2324HI1213GH   N n,,3333nn$*73DMMM#     	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KaWa!eq[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K5??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 )zstring_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7awqz777777r&   )lenjoin)r!   r=   r?   s    ` r$   _string_permutezLutBuilder._string_permuteg   sE     ;1$$$$ww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 rt	          |          }|d|         D ]l\  }}|                    d	d
                              dd	                              d
d          }dt          |          z
  }|                    ||f           m|S )zpattern_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.4r   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1XX  ))(2,q/?KKSQ    '>>HA (! U U!5!5g}!M!Ms STTTT '>>HA (! 0 0!//#s33;;CEEMMcSV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	<aiib>Q>QRRA %1A5;nn$ggajjGggajjG__F ooc2..66tR@@G--gwGGGHH  	B 	BG
""3,,44S&AAA$$bjmmWQZ%@AAAA
 x 	, 	,AQJS__!45
BDDbDIJ/ , ,
==,, ,#$a&)DHQK, 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 46" " " "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<<>>DHHH!!8444>>@@DHHH "!r&   imageImage.Imagetuple[int, Image.Image]c                *   | j         d}t          |          |j        dk    rd}t          |          t	          j        |j        |j        d          }t          j        t          | j                   |j
        j        |j
        j                  }||fS )zRun 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imid)r!   ru   r#   outimagecounts        r$   r   zMorphOp.apply   s    
 8&CC.. :(CS//!9UZT::#E$(OOUX[(+.QQhr&   list[tuple[int, int]]c                    | j         d}t          |          |j        dk    rd}t          |          t	          j        t          | j                   |j        j                  S )zGet 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   r!   ru   r#   s      r$   rh   zMorphOp.match   sZ     8&CC.. :(CS//!"5??EHK@@@r&   c                v    |j         dk    rd}t          |          t          j        |j        j                  S )zGet 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   r   s      r$   r   zMorphOp.get_on_pixels   s7     :(CS//!*58;777r&   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 **DH	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ tx==H$$DH-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GGDH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	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    A A A A	8 	8 	8 	8! ! ! !        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&   