
    =	f                     v   d dl mZmZ d dl d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dl
mZ dZdZdZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d4dZ"d Z#d Z$d Z%d Z&d  Z'd! Z(d" Z)d# Z*d$ Z+d% Z,d& Z-d' Z.d( Z/d) Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6d0 Z7d1 Z8d2 Z9d3 Z:y)5    )utilsos_utils)*N)core_install)dcheck   2      c           	      8   dd l }dd l}	 | j                  d   | j                  d   f}t        |j	                  |      dz        }|j                  |j                  ||d      g dg      }|j                  |ddddf         }|d   dz  }|d   dz  }	|j	                  | |	g      |z  j                  d   |j	                  ||	g      |z  j                  d   |j	                  | |	 g      |z  j                  d   |j	                  ||	 g      |z  j                  d   g}
|
D cg c]  }|d   	 }}|D cg c]
  }|dkD  s	| }}|D cg c]
  }|dk  s	| }}|
D cg c]  }|d   	 }}|D cg c]
  }|dkD  s	| }}|D cg c]
  }|dk  s	| }}t        |      }t        |      }t        |      }t        |      }t        t        ||z
              }t        t        ||z
              }|j                  ddt        |dz  |z
        gddt        |dz  |	z
        gg dg      }|j                  |      |j                  |      z  ddd d f   }|j                  | |||f|j                        }|S c c}w c c}w c c}w c c}w c c}w c c}w )Nr               ?)r   r   r         ?)flags)numpycv2shapetuplearrayvstackgetRotationMatrix2DmatrixAmaxminintabs
warpAffineINTER_LINEAR)imageanglenpr   
image_sizeimage_centerrot_matrot_mat_notranslateimage_w2image_h2rotated_coordsptx_coordsxx_posx_negy_coordsyy_posy_negright_bound
left_bound	top_bound	bot_boundnew_wnew_h	trans_mat
affine_matresults                                (/usr/share/hplip/base/imageprocessing.pyrotate_imager=   4   s    ++a.%++a.1J*-12L ii		 	 uc	:IFG ))GAaC1H$56 !}s"H!}s"H 
H9x(	),?	?BB1E	Hx(	),?	?BB1E	H9xi(	),?	?BB1E	Hxi(	),?	?BB1E	N !//"1/H/ *1AEQ*E* *1AEQ*E* ./"1/H/ *1AEQ*E* *1AEQ*E*e*KUJE
IE
IK*,-.EI	)*+E 			
As53;)*+	
As53;)*+ I ))I&7);;QqS!VDJ ^^		  F ME 0**/**s<   'I>9
JJ
JJ#J5
J J

JJc                    t        t        j                  |t        j                  dz  z              dz  }|dz  dk(  r|nt        j                  |z
  }|t        j                  z  t        j                  z   t        j                  z  }| t        j                  |      z  |t        j
                  |      z  z   }| t        j
                  |      z  |t        j                  |      z  z   }| |k  rt        j                  ||      nt        j                  ||      }t        j                  |z
  |z
  }	| |k  r|n| }
|
t        j                  |      z  }|t        j
                  |      z  t        j
                  |	      z  }|t        j                  |      z  }|t        j                  |      z  }|d|z  z
  |d|z  z
  fS )a9  
    Given a rectangle of size wxh that has been rotated by 'angle' (in
    radians), computes the width and height of the largest possible
    axis-aligned rectangle within the rotated rectangle.

    Original JS code by 'Andri' and Magnus Hoff from Stack Overflow

    Converted to Python by Aaron Snoswell
    r      r   r   )r   mathfloorpicossinatan2tan)whr!   quadrant
sign_alphaalphabb_wbb_hgammadeltalengthdar0   r,   s                  r<   largest_rotated_rectrS   {   sd    4::etww{3459H$qLQ.TWWu_J$''!DGG+tww6EtxxTXXe_!44DtxxTXXe_!44D'(1uDJJtT"4::dD3IEGGeOe#Eq5QqF% A	DHHUOdhhuo-A	DHHUOA	DHHUOA 	q1uq1u     c                 l   | j                   d   | j                   d   f}t        |d   dz        t        |d   dz        f}||d   kD  r|d   }||d   kD  r|d   }t        |d   |dz  z
        }t        |d   |dz  z         }t        |d   |dz  z
        }t        |d   |dz  z         }| ||||f   S )zn
    Given a NumPy / OpenCV 2 image, crops it to the given width and height,
    around it's centre point
    r   r   r   )r   r   )	r    widthheightr#   r$   x1x2y1y2s	            r<   crop_around_centerr\      s     ++a.%++a.1J
1+,c*Q-#2E.FGLz!}1
1A	\!_us{*	+B	\!_us{*	+B	\!_v|+	,B	\!_v|+	,BB2rT   c                 b   dd l }dd l}ddlm} dd l}|j                  |       }|j                  dd \  }}|j                  ||j                        }|j                  |ddd      }	|j                  |	d|j                  dz  ddd	
      }
g }g }|
d   D ]c  \  }}}} |j                   |j                  ||z
  ||z
              }|j                  |       t        |      }|dk7  sS|j                  |       e |sd}|S t!        |      }|D ]  }|t        |      k(  s|} |dk\  s|dk  rd}|S )Nr   Imager   d   r?   )apertureSizer   g     f@   )minLineLength
maxLineGap   )r   r   PILr_   r@   r   r   cvtColorCOLOR_BGR2GRAYCannyHoughLinesPrB   degreesrE   appendr   r   )imgr"   r   r_   r@   r    image_heightimage_widthgrayedgeslinesanglestemp_anglesrX   rZ   rY   r[   r!   median_angleitems                       r<   Deskew_angle1rx      sH   
((3-E %Aa 0L+<<s112DIIdC1I5EOOE1dggos#Z[O\EFK( !BBZTZZRb9:5!E
A:MM% ! 6{  3t9$L  	lc1rT   c                     dd l }dd l}dd lddlm} ddlm | j                  \  }}j                  | j                  d      j                         j                        }d|j                  ||f      dz  z
  }fd}d}	d}
j                  |
 |
|	z   |	      }g }|D ]  } |||      \  }}|j                  |       ! |sd}|S t        |      }||j!                  |         }|dk  r|}n|}|d	k\  s|d
k  rd}|S )Nr   r^   interpolation1r        o@c                     j                  | |dd      }j                  |d      }j                  |dd  |d d z
  dz        }||fS )NFr   )reshapeorderr   axisr   )rotatesum)arrr!   datahistscoreinterr"   s        r<   
find_scorez!Deskew_angle2.<locals>.find_score   sY    ||CQ|?vvdv#QR49,23U{rT   rb   re   rf   )sysr@   r   rg   r_   scipy.ndimager{   sizer   convertgetdatauint8r   arangerm   r   index)rn   r   r@   imwdhtpixbin_imgr   rO   limitrt   scoresr!   r   r   
best_angle
best_scorer   r"   s                     @@r<   Deskew_angle2r      s   4 XXFB
((3;;s#++-rxx
8C3;;Bx(501G
 EEYYvuU{E2FF  %0ee 
[
Z01JA~

bJ#-
rT   c           
         dd l }dd l}ddlm} dd l}t        |       }t        |       }|dk  r|dk  rt        ||g      }nt        ||g      }|dk7  r|dk7  s| S |dk\  s|dk  r| S |j                  |       }|j                  dd \  }	}
|j                  |      }t        ||      }t        |gt        |
|	 |j                  |             }|j!                  |      S )Nr   r^   Z   ire   rf   r   )r   r   rg   r_   r@   rx   r   r   r   r   r   copyr=   r\   rS   radians	fromarray)r   r"   r   r_   r@   angle1angle2r!   r    ro   rp   
image_origimage_rotatedimage_rotated_croppeds                 r<   deskewr     s    2F2F{v{VFO$VFO$RKESL	u|	HHRLE %Aa 0L+J .M.
!U#
 ??011rT   c                     ddl m} 	 |j                  |       j                  }|r	|d   dk  ry|d   dk  r|d   dk  r|d   dk  r|dk(  ryy)Nr   )	ImageStati,  Tr   r   F)rg   r   Statvar)r   lineart_moder   vs       r<   	blankpager   (  sY    $rA!A$*Q4#:adSj1<RWCWrT   c                    dd l }dd l}| j                  d d \  }}|dz  |dz  }}|j                  ||f| d      }|j	                  |d         }	|j	                  |d         }
t        ||
z  ||	z  z         }t        ||	z  ||
z  z         }|dxx   |dz  |z
  z  cc<   |dxx   |dz  |z
  z  cc<   |j                  | |||f      S )Nr   r   r   )r   r   )r   r   )r   r   )r   r   )r   r   r   r   r   r   r   )r    r!   r   r"   rH   rG   cXcYMrC   rD   nWnHs                r<   rotate_boundr   5  s     [[!_FQAq1uR
 	R5&#6A
&&4/C
&&4/C 
a#g!c'"	#B	a#g!c'"	#B dGQ"}GdGQ"}G >>%RH--rT   c                    t        t                     dk\  r)dd l}|j                  |j                  d       ddlm}m} nddlm}m}  ||j                        5 }	 |j                  |        |j                          |j                         }|j                         \  }}}}	|cd d d        S # t        $ r% | j                  d      } |j                  |        Y mw xY w# 1 sw Y   y xY w)N   r   C)PyTessBaseAPIPSM)psmRGB)r   get_tesseract_versionlocale	setlocaleLC_ALL	tesserocrr   r   AUTO_OSDSetImageIOErrorr   	RecognizeAnalyseLayoutOrientation)
r   r   r   r   apiitorientation	directionr   deskew_angles
             r<   orientangler   O  s    
 "#q(,000	3<<	( 
C	LL 	 68nn6F3Y|
 
  	E"BLL	
 
s0   CB..6C.+CCCCC(c                     ddl m} dd l}ddddd}t        |j	                  |       ||         }|j                  |      S )Nr   r^   i     r   )r   r   r   r?   )rg   r_   r   r   r   r   )r   r!   r_   r"   orient_dictrotateds         r<   
autoorientr   c  s>    3#,K"k%&89GOOG$$rT   c                 V    | j                   \  }}| j                  dd|dz
  |dz
  f      S )N   )r   crop)rn   rG   rH   s      r<   initialcropr   m  s/    88DAq88RQrT1R4())rT   c                     t        |       D ]P  \  }}|j                          t        t        |d t                     t        |d t               z  }|t        k  sN|c S  S N)	enumeratesortfloatr   obviousnesslen	threshold)valsitmpaverages       r<   	find_liner   q  s]    4 #
C-./C4E0FFiH	
 HrT   c           	      \   dd l }| j                  \  }}dd||g}t        | j                               }g }|D ]  }|j	                  t        |              t        j                         }|j                  d      }	|	d   dk\  r5|j                  t        |      D 
cg c]  }
||
|z  |
dz   |z    c}
      }n4|j                  t        |      D 
cg c]  }
||
|z  |
dz   |z    c}
      }|j                         }t        |      |d<   |j                  |      }|t        |      z
  |d<   |j                  |dd      }t        |      |d<   |j                  |dd      }|j                  |      }|t        |      z
  |d<   |d   |d   k\  s|d   |d   k\  ry t!        |      S c c}
w c c}
w )Nr   .3r   r?   r   )r   r   listr   rm   r   platformpython_versionsplitr   rangexranger   r   flipudswapaxesr   )rn   r"   rV   rW   retvalpixelsr   pixel
pyPlatformnumr   forupperforlowerforleftforrights                  r<   getboxr   z  s    HHME6%F#++- FD  CJ  ((*J


3
C
1v}xx%-PQa%iQ%8PQxx&.QQa%iQ%8QR yy{H(#F1I yy"H8,,F1I kk(1Q'G'"F1I {{8Aa(Hyy"H	(++F1IayF1IfQi!7=5 QQs   F$F)c                    ddl m} dd l}dd l}|j	                  |j                  |       d      }t        |      }|j                  |dkD        }|j                  d      \  }}|j                  d      \  }	}
|j                  |       ||	||
f   }t        |j                  |            }t        |      }|j                  |      }|S )Nr   r^   r?   r?   r   )rg   r_   r   r   blurr   
auto_cannyargwherer   r   r   r   r   r   )r   r_   r"   r   blurredcannyptsrZ   rX   r[   rY   croppedrn   boxr;   s                  r<   autocropr    s    hhrxx|U+GwE ++eAg
CGGGOEBrGGGOEBrhhrl2b5"R%<(G
eoog.
/C
+CXXc]FMrT   c                 X   ddl m} dd l}dd l}|j	                  |j                  |       d      }|j                  |dd      }|j                  |dkD        }|j                  d      \  }}|j                  d      \  }	}
|j                  |       d|	||
f   }|j                  |      S )Nr   r^   r   
   r   r   )rg   r_   r   r   r   r   rj   r   r   r   r   )r   r_   r"   r   r   r   r  rZ   rX   r[   rY   r  s               r<   	mixedfeedr    s    hhrxx|U+GIIgr3'E
++eAg
CGGGOEBrGGGOEBrhhrl1R4B;'G??7##rT   c                     	 ddl m}m}  |       }| D ]  }	 |j                   ||      d        	 |j                  |       | D ]  }t        j                  |        |S #  ddl m} ddl m}  |       }Y gxY w)Nr   )PdfFileMergerPdfFileReader	PdfMerger)	PdfReaderhpscan)	PyPDF2r	  r
  r  r  rm   writeosremove)adf_page_files
outputfiler	  r
  mergerps         r<   generatePdfFiler    s    !7  2	 	mA&12
LL 
		!+!55s   A! !A8c           	      R   ddl m} ddlm}	 	 |j	                  ||dz  |dz  f      }
d}| D ]  }|	j                  |      }	 |rW||   dk(  s||   dk(  rG|
j                  ||z
  dz  ||z
  dz  f       |
j                  ||dz  |dz  ||z
  dz  ||z
  dz         nF|
j                  ||z
  dz  ||z
  dz  f       |
j                  ||dz  |dz  ||z
  dz  ||z
  dz         |
j!                          t#        j$                  |       |dz  } |
j'                          |S # t        $ r t        j                  d       Y ^t        $ r:}t        j                  |       t        rt        j                  d       Y d }~d }~wt        $ r}t        j                  d       Y d }~d }~ww xY w)Nr   )canvasr^   gׁsF?r   r?   )reportlab.pdfgenr  rg   r_   CanvasopensetPageSizedrawInlineImage	NameErrorr   exitAssertionErrorlogerrorPY3	ExceptionshowPager  unlinksave)r  r  orient_listbrxbrytlxtlyoutput_pathr  r_   cr   r  r   es                  r<   generatePdfFile_canvasr1    s   '& 	j3v:s6z":;AA JJqMr{1~2k!n6I}}s3w.S&0@AB  c&jCJ3s7FBRWZ[^W^`fVfh}}s3w.S&0@AB  c&jCJ3s7FBRVYZ]V]_eUeg 	zz|	yy|!tq7< FFH -  88A; 99Q< xx{  88A;;s+   BDF&>F&0E;;F&F!!F&c                     dd l ddlm} 	 ddlm} |dk(  r |       }g }d}	 |t        |       k  rT| |   | |dz      g}|D cg c]  }|j                  |       }	}t        |	D 
cg c])  }
j                  |
j                        |
j                  f+ c}
      d   d   j                  fd|	D              }|j                  |      }|D ]  }t        j                  |        	 |dk(  rZd}|j                  d	      }|j!                  |       j#                  t        |d
             d|z   }t%        j&                  |       n(t%        j(                  d||      }|j!                  |       |dz   }|t        |       k  rT|dk(  r@t%        j(                  d||      }t        |d      5 }j+                  |       d d d        	 |S y #  ddlm} |dk(  r |       }Y xY wc c}w c c}
w # 1 sw Y   	 |S xY w)Nr   r^   )r	  .pdfr  r   c              3   ^   K   | ]$  }j                  |j                               & y wr   )asarrayresize).0rG   	min_shaper"   s     r<   	<genexpr>z documentmerge.<locals>.<genexpr>L  s#     Qa

AHHY,? AQs   *-ztemp.pdfr   rbzrm -f 	hpscandocr   wb)r   rg   r_   r  r	  r  r   r  sortedr   r   hstackr   r  r  r   r(  rm   r   runcreateSequencedFilenamer  )r  extr.  r_   r	  r  list_imr   r0   imgsz	imgs_combr  tempcmdoutputfoutr8  r"   s                    @@r<   documentmergerJ  $  s   %(&="_F G	A"& c.!
!!!$nQqS&9:*13Q5::a=33E1bffQVVnaff6EFqI!L	IIQ4QS	 OOY/	 	AIIaL		 &=D!))%0INND"MM$tD/*T/CIIcN 00c;ODNND"E? c.!
!@ f}..{CM&$ 	4LL		!I%5&="_F6 4E<		!s#   G G((.G-0G2G%2G=c                     dd l }dd l}|j                  |       }t        t	        dd|z
  |z              }t        t        dd|z   |z              }|j                  | ||      }|S )Nr   r      )r   r   medianr   r   r   rj   )r    sigmar"   r   r   lowerupperedgeds           r<   r   r   q  se    
		%A Aeq()*EC#+)*+EIIeUE*E LrT   c                     ddl m} dd l}|j                  |       j	                         }d||dk  <   d||dk\  <   |j                  |      S )Nr   r^   r   rL  r   )rg   r_   r   r5  r   r   )r   r_   r"   bws       r<   crushedrT    sG    	B			BBrBwKBrSyM??2rT   c                 4   dd l }dd l}ddlm} |j	                  |       }|j                  ||j                        }d}d}||z  |z   }|j                  |dd      j                  |j                        }|j                  |d ddd      }|j                  |      S )	Nr   r^   g      @g       rL           )r   r   rg   r_   r   rh   ri   clipastyper   fastNlMeansDenoisingr   )	r   r   r"   r_   r    rq   rK   betadenoiseds	            r<   bg_color_removalr^    s    HHRLE <<s112DEDt|d"HwwxC(//9H''$ArBH??8$$rT   c                 V    ddl m} |j                  |       }|j                  |      }|S Nr   )ImageEnhance)rg   ra  	Sharpnessenhancer   factorra  enhancer_objectouts        r<   adjust_sharpnessrh    s*     ",,R0O

!
!&
)CJrT   c                 V    ddl m} |j                  |       }|j                  |      }|S r`  )rg   ra  Contrastrc  rd  s        r<   adjust_contrastrk    s*     "++B/O

!
!&
)CJrT   c                 V    ddl m} |j                  |       }|j                  |      }|S r`  )rg   ra  
Brightnessrc  rd  s        r<   adjust_brightnessrn    s*     "--b1O

!
!&
)CJrT   c                 V    ddl m} |j                  |       }|j                  |      }|S r`  )rg   ra  Colorrc  rd  s        r<   adjust_colorrq    s*     "((,O

!
!&
)CJrT   c                    | j                  d      dk(  rt        d       y d}g d}|D ];  }t        j                  |      }|st        j
                  j                  ||      } n |dk(  rQt        j                  dd      }t        j                  d   d	k(  rKt        j                  d
| |gt        j                  t        j                        }|j                         \  }}	nIt        j                  d| gt        j                  t        j                        }|j                         \  }}	t        j
                  j                  |      r9t         j#                  d       |dz   |z   dz   dz   }
t	        j$                  |        n#t         j#                  d       |dz   | z   dz   dz   }
t'        j(                  |
       y t         j#                  d       |dz   | z   dz   dz   }
t'        j(                  |
       y )Nr3  Fz-PDF viewer is trying open other than PDF file )kpdfacroreadxpdfevincezxdg-openThpscan_ocr_r   r?   ocrmypdf)stdoutstderrpypdfocrzOCR was successfulz   &z/OCR failed to generate, returning original filez+OCR was not called, returning original file)endswithprintr   whichr  pathjoinr@  r   version_info
subprocessPopenPIPESTDOUTcommunicateisfiler"  debugr'  r   execute)rH  ocr
pdf_viewerpdf_viewer_listr   vv
output_ocrrg  rz  r{  rG  s              r<   merge_PDF_viewerr    s   5(=>JHO [[^b!,J	
 d{ 22=&I
A!#""Jvj#A`j`q`qrC??,MF6""Jv#6jooU_UfUfgC??,MF677>>*%II*+t#j036<CIIfIIGHt#f,s2S8C		?@4&(3.4rT   c                  t    d } 	 dd l }| S # t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY wNr   Error occurred)rg   ImportErrorstr)scanjet_flagrg   r#  s      r<   	check_pilr    K    L+    Z +)*   
 	7$7c                  t    d } 	 dd l }| S # t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY wr  )r   r  r  )r  r"   r#  s      r<   check_numpyr    sK    L+    Z +)*r  c                  t    d } 	 dd l }| S # t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY wr  )r   r  r  )r  r   r#  s      r<   check_opencvr    r  r  c                  V    d } 	 dd l }| S #  	 dd l}Y | S #  t        d      } Y Y | S xY wxY wr  )r|  ry  r  )r  r|  ry  s      r<   check_pypdfocrr    sE    L/ /	/ 	/-.Ls   
 (%((c                  t    d } 	 dd l }| S # t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY wr  )skimager  r  )r  r  r#  s      r<   check_skimager    sK    L+    Z +)*r  c                  (   d } 	 t        t                     dk\  r&dd l}|j                  |j                  d       dd l}| S dd l}	 | S # t        $ r}t        |      } Y d }~| S d }~wt        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY w)Nr   r   r   r  )	r   r   r   r   r   r   r  r  AttributeError)r  r   r   r#  s       r<   check_tesserocr_imutilsr    s    L+$&'1,V]]C0      Z 	   Z +)*s)   :A  A 	BA!!B-A>>Bc                  t    d } 	 dd l }| S # t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY wr  )r  r  r  )r  r  r#  s      r<   check_pypdf2r  -  sK    L+    Z +)*r  c                      d } t        j                         }|j                  d      }|d   dk  r	 dd l}| S y# t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY w)Nr   r   r   r  zbar)r   r   r   r  r  r  )r  r   r   r  r#  s        r<   
check_zbarr  8  sw    L((*J


3
C
1v|	/   	$UL 	/-.Ls   8 	A%AA%c                 ,
   dd l }ddlm} g }i }|j                  \  }}	}
t        }t        |t        z
        }t        |	t        z
        }t        }d|cxk  r|k  rn n
d| cxk  r|k  rn n| dz
  }| dz   }||z   }|d|z   z   }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < | dz
  }| dz   }||z
  }|d|z   z
  }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < d|cxk  r|k  rn n
|| cxk  r|	k  rn n| dz
  }| dz   }||z   }|d|z   z   }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < | dz
  }| dz   }||z
  }|d|z   z
  }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < ||cxk  r|k  rn n
d| cxk  r|	k  rn n| d|z   z
  }| |z
  }|dz
  }|dz   }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < | d|z   z   }| |z   }|dz
  }|dz   }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < d|cxk  r|k  rn n
d| cxk  r|	k  rn n| d|z   z
  }| |z
  }|dz
  }|dz   }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < | d|z   z   }| |z   }|dz
  }|dz   }|||||f   }|j                  \  }}}t        d|dz
        D ]:  }t        d|dz
        D ]&  }|||f   }|j                  |d   |d   |d   f       ( < t        |      }|D ]  }|||j                  |      <    |j                         }t        |      }t        |      }||d      }t        |      S )Nr   ior      r   r   r   )r   r  r  r   punchhole_marginr   r   rm   setcountkeysr   r=  ) xcordycordradiusrn   r"   r  lrQ   rV   rW   channelsrX   rY   rZ   r[   s1s2s3s4myimgrG   rH   r/  r   jrgblistmrD  d_keysz_listsortlistts                                    r<   dominantcolorr  H  s   
A
A "iiE68
B((
)B))
*B
B	EEEBQhQhvqx BrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	= QhQhvqx BrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	=
 	
EEU 3V 3QhQhvqx BrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	= QhQhvqx BrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	= 	UUU!3V!3qx vaiaiBrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	= qx vaiaiBrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	=
 	
EBQ//qx vaiaiBrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	= qx vaiaiBrE2b5L!KK	Aq!A# 	=A1ac] =!*'!*WQZ
;<=	= 	AA !''!*VVXF&\Ff~H	
8B<A7NrT   c                    |}t        |       }t        |      }|g}t        d|      D ]U  }t        d      D cg c].  }t        ||   t        |      |dz
  z  ||   ||   z
  z  z         0 }	}|j	                  |	       W |S c c}w )Nr   r?   )r   r   r   r   rm   )
dominant_colorwhite_color
pixelcountnsfRGB_listr  r  curr_vectors
             r<   lineargradientr    s    AnAkAsH1a[ %INqRAs1Q458QqS>AaD1I">>?RR$	% O	 Ss   3Bc                 \   dd l }ddlm} ddlm} ddlm}m} ddlm	}m
} ddlm} 	 ddlm}	 d}
ddlm} 	 d}|j'                  |       }|j(                  d   dk(  r	 ||      }n | ||            } ||      }|j(                  \  }}t*        }t-        |t*        z
        }t-        |t*        z
        }t*        }t/        |      }|j1                  ddd      } |||      } ||||      \  }}}}t3        |||      D ]  \  }}} d|cxk  r|k  rn nd|cxk  r|k  sVn d|cxk  r|k  rn n||cxk  r|k  s;n d|cxk  r|k  rn nd|cxk  r|k  s n ||cxk  r|k  sen hd|cxk  r|k  stn w|
dk(  r 	||| dz   |j(                        \  }!}"n"|
d
k(  r ||f| dz   |j(                        \  }!}"t5        ||| |      }#t3        t7        !      t7        "            D ]  \  }$}%|#d   |#d   |#d   df||$|%f<     |j9                  |      }&|&S # t        $ r dd	lm} d
}
Y w xY w)Nr   r^   r  )rgba2rgbrgb2gray)hough_circlehough_circle_peaks)r   )circler  )diskr  )img_as_ubyte   r   r?   rV  "   r   )total_num_peaks)r   r   rL  )r   rg   r_   r  r  skimage.colorr  r  skimage.transformr  r  skimage.featurer   skimage.drawr  r  r  skimage.utilr  r   r   r  r   r   r   zipr  r   r   )'r   r"   r_   r  r  r  r  r  r   r  draw_importedr  r  	max_peaksrn   img_grayr    rV   rW   rX   rY   rZ   r[   rr   hough_radii	hough_resaccumscxcyradiicenter_ycenter_xr  rrccdominantpixr   r  
finalimages'                                          r<   punchhole_removalr    s=   0B%'  *-I
((2,C		"C=HSM*"EKKME6
B((
)B))
*B
BuE))BA&KUK0I /y+V_`FBE&)"b%&8 P"(F !E!H(9r(9!E!X(>(>BQ%:F%:("U"X)>)>(x6!8SYYGB&(h16!8399MB'(F3GKT"XtBx0 PA&q>;q>;q>3OAaCPP  s#JY  %s   H H+*H+c           	         ddl m} dd l}dd l}dd l}dd l}|j                  | d      }|j                  ||j                        }	t        t        |d   |d   |d               }
g }|j                  t        |
d   dz
  d      t        |
d   |z
  d      t        |
d   |z
  d      gt        |
d   dz   d      t        |
d   |z   d	      t        |
d   |z   d	      gf       |D ]  \  }}|j                  |d      }|j                  |d      }|j                  |	||      }|j                  \  }}t!        d|dz
        D ](  }t!        d|dz
        D ]  }|||f   d	k(  sd
|||f<    *  |j#                  |      }|S )Nr   r^   r   )dtyper   r   r     rL  )rL  rL  rL  rL  )rg   r_   r   r   r@   r   r   rh   COLOR_RGB2HSVr   rgb2hsvrm   r   r   inRanger   r   r   )r   colorcolor_ranger_   r"   r   r@   r   npimghsv_img	hsv_color
boundariesrO  rP  maskrW   rV   rH   rG   r  s                       r<   color_dropoutr     s    HHRgH&Ell5#"3"34GWU1XuQxq:;IJIaL2-q13y|k7QST3UWZ[def[gju[uwxWyzIaL2-s3S19SUX5Y[^_hij_kny_y{~[  AB C % 	4%g.%g.{{7E51

&(# 	4AAeAg& 41I$"3E!A#J4	4	4 'JrT   c                     t         j                  d|z         ddlm} | j                  \  }}|}|}||z
  }||z
  }| j                  ||||f      }	|j                  |	|d      } | S )Nz"edge_erase called with value=%d pxr   )ImageOpswhite)borderfill)r"  r  rg   r  r   r   expand)
r   edge_erase_valuer  rV   rW   lefttoprightbottomim1s
             r<   
edge_eraser  #  s|    II24DDE 77ME6D
C##E##F ''4fe,
-C 
$4'	BBIrT   c                 r   | dz  |dz  |dz  }}} t        | ||      }t        | ||      }||z
  }||k(  rd}nD|| k(  rd||z
  |z  z  dz   dz  }n-||k(  rd|| z
  |z  z  dz   dz  }n||k(  rd| |z
  |z  z  dz   dz  }|dk(  rd}n||z  }|}t        |dz        }t        |dz        }t        dz        }|||fS )	Nr}   r   <   ih  x      rL  r   )r   r   r   )	rgbmxmndfrH   r  r   s	            r<   r  r  7  s    gqw%!qA	Q1B	Q1B	BB	Rx	qAaC8_s"c)	qAaC8_s"c)	qAaC8_s"c)	QwrE
AAGAAGAAaCAa7NrT   c                  x    d } 	 ddl m} | S # t        $ r}t        |      } Y d }~| S d }~w t        d      } Y | S xY w)Nr   rz   r  )r   r{   r  r  )r  r   r#  s      r<   check_scipyr  Q  sK    L+8
 	   Z +)*s    	9&9c                 N    t         j                  dk\  r| j                  d      S | S )N)r?   r   zUTF-8)r   r  decode)r  s    r<   _read_stringr  \  s$    
6!xx  rT   c                     	 t        j                  ddgt         j                  t         j                        } | j                         \  }}t	        |      j                         }|dk(  rt	        |      j                         }t        j                  d|t        j                        }|r|j                  d      }|d   S y# t        $ r
}Y d }~yd }~ww xY w)N	tesseractz-v)r{  rz  rs  z^tesseract ((?:\d+\.)+\d+).*r   r   )r  r  r  r  r  stripresearchr   groupOSError)r  stdout_versionversionversion_matchr0  s        r<   r   r   b  s    k40Q[Q`Q`a"#--/w'--/b=">288:G		"A7BDDQ#))!,G1: s   B<C   	CC)gQ?);baser   r   base.gr@   r  r   r   r  r  	installerr   r   r   r   r  r=   rS   r\   rx   r   r   r   r   r   r   r   r   r   r  r  r  r1  rJ  r   rT  r^  rh  rk  rn  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r    rT   r<   <module>r*     s  6 !   	 
  	  " 	 DN!H,B0d2@.4(%*-^$$6>@KZ%(&P					&	 od6pF(4rT   