Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib64/python3.5/site-packages/PIL/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib64/python3.5/site-packages/PIL/__pycache__/ImageMorph.cpython-35.pyc



�ʴWt �@sbddlmZddlmZddlZd
ZGdd�de�ZGdd	�d	e�ZdS)�)�Image)�
_imagingmorphN��	c@speZdZdZdddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�
LutBuildera~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()

    NcCs�|dk	r||_n	g|_d|_|dk	r�dddgddgdddgdd	gd
d	dgddd
dgi}||kr�td|d��|||_dS)NZcornerz1:(... ... ...)->0z4:(00. 01. ...)->1Z	dilation4z4:(... .0. .1.)->1Z	dilation8z4:(... .0. ..1)->1Zerosion4z4:(... .1. .0.)->0Zerosion8z4:(... .1. ..0)->0Zedgez4:(.0. .1. ...)->1z4:(01. .1. ...)->1zUnknown pattern �!)�patterns�lut�	Exception)�selfr�op_nameZknown_patterns�r
�A/opt/alt/python35/lib64/python3.5/site-packages/PIL/ImageMorph.py�__init__2s&				zLutBuilder.__init__cCs|j|7_dS)N)r)rrr
r
r�add_patternsKszLutBuilder.add_patternscsAddg�d�t��fdd�tt�D��|_dS)Nrr�cs$g|]}�|�@dk�qS)rr
)�.0�i)�m�symbolsr
r�
<listcomp>Qs	z0LutBuilder.build_default_lut.<locals>.<listcomp>�)�	bytearray�range�LUT_SIZEr	)rr
)rrr�build_default_lutNszLutBuilder.build_default_lutcCs|jS)N)r	)rr
r
r�get_lutSszLutBuilder.get_lutcs8t|�dkst�dj�fdd�|D��S)z�string_permute takes a pattern and a permutation and returns the
        string permuted according to the permutation list.
        r�csg|]}�|�qSr
r
)r�p)�patternr
rr[s	z.LutBuilder._string_permute.<locals>.<listcomp>)�len�AssertionError�join)rrZpermutationr
)rr�_string_permuteVszLutBuilder._string_permutec	
Cs�||fg}d|kr�|dd}xVtd�D]H}|j|j|dddddddddd	d
g	�|f�q6Wd|kr�t|�}xX|d|�D]F\}}|j|j|d
ddd	dddddg	�|f�q�Wd|krt|�}xo|d|�D]]\}}|jd
d�jdd
�jdd�}ddt|�}|j||f�qW|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.�4rrr�������M�N�0�Z�1z%d���r0)r�appendr#r �replace�int)	rZ
basic_pattern�optionsZbasic_resultr�resr�nrr
r
r�_pattern_permute]s2		zLutBuilder._pattern_permutec
Cs�|j�g}x�|jD]�}tjd|jdd��}|sXtd|d��|jd�}|jd�}t|jd��}|jd	d�jdd�}||j|||�7}qWxgt	t
|��D]S}||d
jdd�jdd
�}tj|�}|||df||<q�Wx�t	t�D]~}t
|�dd�}ddt
|�|ddd�}x:|D]2\}}	|j|�r�d
dg|	|j|<q�Wq=W|jS)zlCompile all patterns into a morphology lut.

        TBD :Build based on (file) morphlut:modify_lut
        z(\w*):?\s*\((.+?)\)\s*->\s*(\d)�
rzSyntax error in pattern "�"rr*r&� r�.�Xz[01]Nr-rr0)rr�re�searchr2r
�groupr3r7rr �compiler�bin�matchr	)
rrrrr4r�resultrZ
bitpattern�rr
r
r�	build_lut�s.
&%zLutBuilder.build_lut)�__name__�
__module__�__qualname__�__doc__rrrrr#r7rEr
r
r
rrs"%rc@sseZdZdZddddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�MorphOpz*A class for binary morphological operatorsNcCsX||_|dk	r0td|�j�|_n$|dk	rTtd|�j�|_dS)z&Create a binary morphological operatorNrr)r	rrE)rr	rrr
r
rr�s
	zMorphOp.__init__cCs�|jdkrtd��|jdkr6td��tj|j|jd�}tjt|j�|j	j
|j	j
�}||fS)z�Run a single morphological operation on an image

        Returns a tuple of the number of changed pixels and the
        morphed imageNzNo operator loaded�Lz0Image must be binary, meaning it must use mode L)r	r
�moder�new�sizer�apply�bytes�im�id)r�imageZoutimage�countr
r
rrO�s$z
MorphOp.applycCsU|jdkrtd��|jdkr6td��tjt|j�|jj�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.NzNo operator loadedrKz0Image must be binary, meaning it must use mode L)r	r
rLrrBrPrQrR)rrSr
r
rrB�s
z
MorphOp.matchcCs.|jdkrtd��tj|jj�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.rKz0Image must be binary, meaning it must use mode L)rLr
r�
get_on_pixelsrQrR)rrSr
r
rrU�szMorphOp.get_on_pixelsc	Cs\t|d��}t|j��|_WdQRXt|j�dkrXd|_td��dS)z!Load an operator from an mrl file�rbNi zWrong size operator file!)�openr�readr	r r
)r�filename�fr
r
r�load_lut�s
	zMorphOp.load_lutc	CsH|jdkrtd��t|d��}|j|j�WdQRXdS)zSave an operator to an mrl fileNzNo operator loaded�wb)r	r
rW�write)rrYrZr
r
r�save_lut�szMorphOp.save_lutcCs
||_dS)z#Set the lut from an external sourceN)r	)rr	r
r
r�set_lut�szMorphOp.set_lut)rFrGrHrIrrOrBrUr[r^r_r
r
r
rrJ�s

	rJi)ZPILrrr=r�objectrrJr
r
r
r�<module>s
�