K ir!dddlmZddlZddlmZmZdZgdZgdZGdd Z Gd d Z y) ) annotationsN)Image _imagingmorphi) rr) r rrr r rr r rcfeZdZdZ d d dZd dZd dZddZddZ ddZ dd Z y) LutBuilderaTA 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|||_ng|_d|_|3ddgdgddgdgddggdd}||vrd |d }t||||_yy) N1:(... ... ...)->0z4:(00. 01. ...)->1z4:(... .0. .1.)->1z4:(... .0. ..1)->1z4:(... .1. .0.)->0z4:(... .1. ..0)->0)rz4:(.0. .1. ...)->1z4:(01. .1. ...)->1)corner dilation4 dilation8erosion4erosion8edgezUnknown pattern !)patternslut Exception)selfrop_nameknown_patternsmsgs T/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/PIL/ImageMorph.py__init__zLutBuilder.__init__As  $DMDM%)  /1EF2324HI1213GH Nn,( 3n$*73DM# c.|xj|z c_yNr)rrs r add_patternszLutBuilder.add_patterns\s ! r"cbddgdtfdttD|_y)Nrrc34K|]}|zdkDyw)rN).0imsymbolss r z/LutBuilder.build_default_lut..bsKaWa!eq[1Ks) bytearrayrangeLUT_SIZEr)rr-r.s @@r build_default_lutzLutBuilder.build_default_lut_s'a& K5?KKr"c|jSr$r)rs r get_lutzLutBuilder.get_lutds xxr"cXt|dk(sJdjfd|DS)zstring_permute takes a pattern and a permutation and returns the string permuted according to the permutation list. c3(K|] }| ywr$r*)r+ppatterns r r/z-LutBuilder._string_permute..ls7awqz7s)lenjoin)rr< permutations ` r _string_permutezLutBuilder._string_permutegs-;1$$$ww7;777r"c||fg}d|vrE|dd}tdD]/}|j|j|ddt|f1d|vr?t |}|d|D],\}}|j|j|t |f.d|vrkt |}|d|D]X\}}|j d d j d d j d d }dt|z }|j||fZ|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.4rr rMNN0Z1)r1appendr@ROTATION_MATRIXr= MIRROR_MATRIXreplaceint) r basic_patternoptions basic_resultrresr,nr<s r _pattern_permutezLutBuilder._pattern_permutens( #L12 '>2,q/C1X ))(2,q/?KSQ  '>H A (!  U !5!5g}!Ms ST U '>H A (!  0 !//#s3;;CEMMcSVW#c(l#/  0 r"c`|j|jJg}|jD]}tjd|j dd}|sd|zdz}t ||jd}|jd}t|jd }|j d dj dd}||j|||z }g}|D]P}|d j d d j d d}|jtj||dfRttD]Z} t| dd} ddt| z z| zddd} |D]+\}} |j!| sd dg| |j| <-\|jS)zlCompile all patterns into a morphology lut. TBD :Build based on (file) morphlut:modify_lut Nz(\w):?\s*\((.+?)\)\s*->\s*(\d) r9zSyntax error in pattern ""rr r r.Xz[01]rFr8rC)r3rrresearchrLrgrouprMrSrIcompiler1r2binr=match) rrr;r-rrOr<resultcompiled_patternsr, bitpatternrs r build_lutzLutBuilder.build_luts  xx### HA ;QYYtR=PQA1A5;n$ggajGggajG_Fooc2.66tR@G --gwG GH H BG ""3,44S&AA  $ $bjjmWQZ%@ A Bx ,AQJS_!45 BDbDIJ/ , ==,#$a&)DHHQK ,  ,xxr")NN)rlist[str] | Noner str | NonereturnNone)rz list[str]rgrh)rgrh)rgbytearray | None)r<strr?z list[int]rgrj)rNrjrOrjrPrMrgzlist[tuple[str, int]])rgr0) __name__ __module__ __qualname____doc__r!r&r3r6r@rSrdr*r"r rrsl!HHL4(4:D4 46"L 8 +.>A @*r"rc^eZdZdZ d d dZd dZd dZd dZddZddZ dd Z y)MorphOpz*A class for binary morphological operatorsNc||_| t|j|_y| t|j|_yy)z&Create a binary morphological operatorN)rr%)rrrd)rrrrs r r!zMorphOp.__init__sF  !'2<<>DH  !!84>>@DH"r"cV|j d}t||jdk7r d}t|t j |j|j d}tjt|j|j|j}||fS)zRun a single morphological operation on an image Returns a tuple of the number of changed pixels and the morphed imageNNo operator loadedLImage mode must be L) rrmode ValueErrorrnewsizerapplybytesgetim)rimageroutimagecounts r rzz MorphOp.applys 88 &CC. :: (CS/ !99UZZT:##E$((OU[[]HNNDTUhr"c|j d}t||jdk7r d}t|t j t |j|jS)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`.rsrtru)rrrvrwrr_r{r|rr}rs r r_z MorphOp.matchsY 88 &CC. :: (CS/ !""5?EKKMBBr"c|jdk7r d}t|tj|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`.rtru)rvrwr get_on_pixelsr|rs r rzMorphOp.get_on_pixelss6 :: (CS/ !**5;;=99r"ct|d5}t|j|_dddt |jt k7rd|_d}t |y#1swY:xYw)z!Load an operator from an mrl filerbNzWrong size operator file!)openr0readrr=r2r)rfilenamefrs r load_lutzMorphOp.load_lutsb (D ! +Q *DH + txx=H $DH-CC.  % + +s A%%A.c|j d}t|t|d5}|j|jdddy#1swYyxYw)zSave an operator to an mrl fileNrswb)rrrwrite)rrrrs r save_lutzMorphOp.save_lutsL 88 &CC. (D ! Q GGDHH    s A  Ac||_y)z#Set the lut from an external sourceNr5)rrs r set_lutzMorphOp.set_luts r")NNN)rrirrfrrergrh)r} Image.Imagergztuple[int, Image.Image])r}rrgzlist[tuple[int, int]])rrjrgrh)rrirgrh) rkrlrmrnr!rzr_rrrrr*r"r rprps_4!%"%) A  A A# A  A C :!r"rp) __future__rrZr9rrr2rJrKrrpr*r"r rs<# "   [[|NNr"