a
    ç´«js!  ã                   @  sX   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	„ d	ƒZ	G d
d„ dƒZ
dS )é    )ÚannotationsNé   )ÚImageÚ_imagingmorphi   )	é   é   r   é   é   r   é   é   é   )	r   r   r   r   r	   r   r
   r   r   c                   @  s„   e Zd ZdZd ddddœdd„Zd	dd
œdd„Zddœdd„Zddœdd„Zddddœdd„Zdddddœdd„Z	ddœ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úlist[str] | Noneú
str | NoneÚNone)ÚpatternsÚop_nameÚreturnc                 C  st   |d ur|| _ ng | _ d | _|d urpddgdgddgdgddgg d¢dœ}||vrfd	|› d
�}t|ƒ‚|| | _ 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)ZcornerZ	dilation4Z	dilation8Zerosion4Zerosion8ÚedgezUnknown pattern ú!)r   ÚlutÚ	Exception)Úselfr   r   Zknown_patternsÚmsg© r   úM/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/PIL/ImageMorph.pyÚ__init__A   s     úzLutBuilder.__init__z	list[str])r   r   c                 C  s   |  j |7  _ d S ©N©r   )r   r   r   r   r   Úadd_patterns\   s    zLutBuilder.add_patterns)r   c                   s.   ddg‰d‰ t ‡ ‡fdd„ttƒD ƒƒ| _d S )Nr   r   é   c                 3  s   | ]}ˆ|ˆ @ d k V  qdS )r   Nr   )Ú.0Úi©ÚmÚsymbolsr   r   Ú	<genexpr>b   ó    z/LutBuilder.build_default_lut.<locals>.<genexpr>)Ú	bytearrayÚrangeÚLUT_SIZEr   ©r   r   r$   r   Úbuild_default_lut_   s    zLutBuilder.build_default_lutúbytearray | Nonec                 C  s   | j S r   ©r   r,   r   r   r   Úget_lutd   s    zLutBuilder.get_lutÚstrz	list[int])ÚpatternÚpermutationr   c                   s(   t |ƒdksJ ‚d ‡ fdd„|D ƒ¡S )z„string_permute takes a pattern and a permutation and returns the
        string permuted according to the permutation list.
        é	   Ú c                 3  s   | ]}ˆ | V  qd S r   r   )r"   Úp©r2   r   r   r'   l   r(   z-LutBuilder._string_permute.<locals>.<genexpr>)ÚlenÚjoin)r   r2   r3   r   r7   r   Ú_string_permuteg   s    zLutBuilder._string_permuteÚintzlist[tuple[str, int]])Úbasic_patternÚoptionsÚbasic_resultr   c           	      C  sæ   ||fg}d|v rJ|d d }t dƒD ]"}| |  |d d t¡|f¡ q&d|v r†t|ƒ}|d|… D ]\}}| |  |t¡|f¡ qfd|v rât|ƒ}|d|… D ]>\}}| d	d
¡ dd	¡ d
d¡}dt|ƒ }| ||f¡ q¢|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)r*   Úappendr:   ÚROTATION_MATRIXr8   ÚMIRROR_MATRIXÚreplacer;   )	r   r<   r=   r>   r   Úresr#   Únr2   r   r   r   Ú_pattern_permuten   s$    
ÿzLutBuilder._pattern_permuter)   c                 C  sH  |   ¡  | jdusJ ‚g }| jD ]x}t d| dd¡¡}|sPd| d }t|ƒ‚| d¡}| d¡}t| d	¡ƒ}| d
d¡ dd¡}||  	|||¡7 }q g }|D ]4}|d  dd¡ dd¡}| 
t |¡|d f¡ q¢ttƒD ]`}	t|	ƒdd… }
ddt|
ƒ  |
 ddd… }
|D ](\}}| |
¡�rddg| | j|	< �qqà| jS )zlCompile all patterns into a morphology lut.

        TBD :Build based on (file) morphlut:modify_lut
        Nz(\w*):?\s*\((.+?)\)\s*->\s*(\d)Ú
r5   zSyntax error in pattern "ú"r   r   r   ú r   Ú.ÚXz[01]rC   r4   r@   )r-   r   r   ÚreÚsearchrI   r   Úgroupr;   rL   rF   Úcompiler*   r+   Úbinr8   Úmatch)r   r   r6   r%   r   r=   r2   ÚresultZcompiled_patternsr#   Z
bitpatternÚrr   r   r   Ú	build_lutŽ   s0    


zLutBuilder.build_lut)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r-   r0   r:   rL   rZ   r   r   r   r   r      s   $ ÿ r   c                   @  s†   e Zd ZdZddddddœdd	„Zd
ddœdd„Zd
ddœdd„Zd
ddœdd„Zdddœdd„Zdddœdd„Z	dddœdd„Z
dS )ÚMorphOpz*A class for binary morphological operatorsNr.   r   r   r   )r   r   r   r   c                 C  s<   || _ |dur t|d� ¡ | _ n|dur8t|d� ¡ | _ dS )z&Create a binary morphological operatorN)r   r   )r   r   rZ   )r   r   r   r   r   r   r   r   ¾   s
    zMorphOp.__init__zImage.Imageztuple[int, Image.Image])Úimager   c                 C  sb   | j du rd}t|ƒ‚|jdkr,d}t|ƒ‚t |j|jd¡}t 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   r`   r   ZoutimageÚcountr   r   r   rh   Ë   s    

zMorphOp.applyzlist[tuple[int, int]]c                 C  sB   | j du rd}t|ƒ‚|jdkr,d}t|ƒ‚t 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`.Nra   rb   rc   )r   r   rd   re   r   rW   ri   rj   ©r   r`   r   r   r   r   rW   Û   s    

zMorphOp.matchc                 C  s$   |j dkrd}t|ƒ‚t | ¡ ¡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`.rb   rc   )rd   re   r   Úget_on_pixelsrj   rl   r   r   r   rm   ê   s    
zMorphOp.get_on_pixelsr1   )Úfilenamer   c                 C  s\   t |dƒ�}t| ¡ ƒ| _W d  ƒ n1 s.0    Y  t| jƒtkrXd| _d}t|ƒ‚dS )z!Load an operator from an mrl fileÚrbNzWrong size operator file!)Úopenr)   Úreadr   r8   r+   r   )r   rn   Úfr   r   r   r   Úload_lutõ   s    ,zMorphOp.load_lutc                 C  sP   | j du rd}t|ƒ‚t|dƒ�}| | j ¡ W d  ƒ n1 sB0    Y  dS )zSave an operator to an mrl fileNra   Úwb)r   r   rp   Úwrite)r   rn   r   rr   r   r   r   Úsave_lutÿ   s
    
zMorphOp.save_lut)r   r   c                 C  s
   || _ dS )z#Set the lut from an external sourceNr/   )r   r   r   r   r   Úset_lut  s    zMorphOp.set_lut)NNN)r[   r\   r]   r^   r   rh   rW   rm   rs   rv   rw   r   r   r   r   r_   »   s      ü
r_   )Ú
__future__r   rR   r5   r   r   r+   rG   rH   r   r_   r   r   r   r   Ú<module>   s    