
    |uh                         S SK JrJrJrJrJr  S SKrS SKr	S SK
Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S	 rS
 rS rS rS rS rS rS rS rS rS r g)    )tools	pyprocess
validationfiltersscalingN)griddata)pyplot)
hsv_to_rgb)tqdm)feature)linec                 "   US:X  a#  [         R                  " U R                  5       SS9  [        R                  " U R                  5       SS9n[        R
                  " US   S:H  5      nUS   S   n[        R                  " US   U   SS9S	-  nU$ )
NTd   )binsr         )decimalsg)\(?)plthistflattennp	histogramwherearound)	sig2noise	show_hist
hist_arrayzero_indices	last_zeronoise_thresholds         [/projects/USU/Gabriel_Internship-2025/Enamel_Project/OpenPIV/Quivercode/enamel_rod_recon.pyget_noise_thresholdr#      s    D""$3/i//1<J88JqMQ./LQ#Iii
1i 81EdJO    c                    [         R                  " U 5      nUn[         R                  " / 5      R                  SS5      n[	        SUR
                  S   5       Hi  nUS   US   US   pnUS S 2SS2U4   nUS S 2SS2U4   n[        XX4US9nX4X-  -   u  pX-   n
XU
/nUS   US   U/n[         R                  " XT45      nMk     XV4$ )Nr      r   r      )method)r   asarrayarrayreshaperangeshaper   vstack)r0flowfield_arraydzr(   current_pospos_3D_vectordisplacement_vectorixyzpointsvaluesdisplacement_ratecurrent_disps                  r"   reconstruct_rodr=      s    **R.KM((2,..q31_**1-.a.+a.+a.a !AaC+ AaC+$VaU6Je'**F1g)!,->q-A"E		="=> /& --r$   c           
         [         R                  " U R                  [        R                  5      UR                  [        R                  5      US   US   US   US   SS9u  p4n[         R
                  " U R                  US   US   S9u  pgUS   n[        R                  " UUS	9n	[        R                  " X4U	S
US   US   S9u  p[        R                  " XgXUS   S9u  pgp[        R                  " XgX5      u  pgpXgXU	4$ )Nwinsizeoverlapr1   
searchsize	peak2peak)window_sizer@   dtsearch_area_sizesig2noise_method)
image_sizerE   r@   r!   )	threshold	localmeanmax_iterkernel_size)r(   rJ   rK   scaling_factor)rL   )r   extended_search_area_pivastyper   uint32get_coordinatesr-   r   sig2noise_valr   replace_outliersr   uniformr   transform_coordinates)frame_aframe_bparamsu0v0r   r6   r7   r!   invalid_masku2v2u3v3s                 r"   generate_flowfieldr_   .   s   !::ryy!ryy!9%y!$<-$&BI $$==-y!#DA ./O++#%L %%

#=)+FB ??	b 013LA" ..qR<LA"%%r$   c                 ,   U S S 2SS4   R                  5       U S S 2SS4   R                  5       p!U S S 2SS4   R                  5       U S S 2SS4   R                  5       pCU S S 2SS4   R                  5       U S S 2SS4   R                  5       peX4X44XV44$ )Nr   r   r   )minmax)r0   xminxmaxyminymaxzminzmaxs          r"   get_boundariesri   Y   s     1Q'++-q1u/E/I/I/K$ 1Q'++-q1u/E/I/I/K$ 1Q'++-q1u/E/I/I/K$<$|33r$   c           
         US   nU S   U S   pTU S   S   n[         R                  " US   US   US   S-   5      n[         R                  " US   US   US   S-   5      n/ n	/ n
[        US   US   -  S9 nUSS  HH  nUSS  H<  n[        XU4XS   US   5      u  pU	R	                  U5        UR                  S5        M>     MJ     S S S 5        [        S	5        X4$ ! , (       d  f       N= f)
Ngridnumsr   r   r   )totalr   r1   interp_methodzAll points completed.)r   linspacer   r=   appendupdateprint)grid_boundsr0   rW   rk   xrangeyrangez0x0_ptsy0_ptsrod_pathlines_arraydisplacement_arraypbarx0y0r3   _s                   r"   grid_reconstructr~   _   s   j!H ^[^F	Q	B [[6!9Xa[];F[[6!9Xa[];F 
HQK+	,2,BQrl#2BB<Y]R^`fgv`w#x #**=9 A #  
- 

!"22 
-	,s   5AC
C+c                     [         R                  " U SSS9u  pn[        R                  " SUR	                  5       -  UR	                  5       UR	                  5       -
  5      S-  nU$ )Nxyreflect)ordermoder   )r   structure_tensorr   arctan2mean)imgaxxaxyayydom_oris        r"   dominant_directionr   z   sO    ,,SINMCcjj388:
SXXZ(?AAEGNr$   c                 X   Sn[         R                  " U R                  [        R                  5      USS9u  p4n[         R
                  " X4U5      u  pg[        R                  SU-  XS-
  5      S-  nXv-
  Xv-   U-   -  S-  n	[        R                  X5-   5      n
XR                  5       -  n
XU
4$ )z=OrientationJ's output for
* orientation
* coherence
* energy
g#B;r   )sigmar   r   )	r   r   rN   numpyfloat32structure_tensor_eigvalsr   sqrtrb   )r   r   epsr   r   r   l1l2oricohenes              r"   orientation_analysisr      s     C,,

5==!YMCc --c<FB
--C#)
-
1CG#&1
,C
**SY
C779CS=r$   c           
      ~   [        U 5      n[        SR                  US-  [        R                  -  5      5        U R
                  S   S-
  U R
                  S   S-
  pCSu  pVUn[        XWU-
  [        R                  " U5      -  -   5      n/ n	[        U[        X8-
  5      U5       H  n
[        XeU
-   XxU
-   5      u  p[        R                  " US-  US-  -   5      nU	R                  [        R                  " UR                  SS5      XU4   R                  SS5      45      5        M     [        R                  " U	5      $ )Nz%Dominant direction is {:.2f} degrees.   r   r   )r   r   r   r   )r   rq   formatr   pir-   inttanr,   r   r   ro   hstackr+   r)   )band_img
n_px_spacethx_maxy_maxx_starty_starty_endx_endpixel_data_arrayx_countrrcclengths                 r"   generate_meas_linesr      s   	H	%B	
1
8
8C
FG>>!$Q&q(9!(;5GE="&&*445E#ek"2J?gwW}EQQ'		6>>"Q+?R@P@X@XY[\]@^*_ `a @
 ::&''r$   c                    / n[        SU R                  S   5       H  nXS S 2S4   nXS S 2S4   [        R                  " XS S 2S4   5      S-  -
  S:  nUSS USS  -  n[        R                  " US:H  5      S   n[        R
                  " XG   5      nUR                  U5        M     [        R                  " U V	V
s/ s H  o  H  oPM     M     sn
n	5      nX"U:     nU$ s  sn
n	f )Nr   r   r   r   T)r,   r-   r   rb   r   diffro   r)   )r   min_rod_diamwidth_data_array
line_indexr   gv_shiftchangeschange_indexwidthssubr5   s              r"   calculate_bandwidthsr      s    A.44Q78
!Qq.1$!^4rvv>NZ[\]~>^7_ab7bbfgg1R.!"-xx.q1-.' 9 zz0@"N0@#Q1#10@"NO'<(GH #Os   >C#
c                     U * [         R                  S-  -   n U S[         R                  -  -  n U S:  a  U S[         R                  -  -  n [        U S[         R                  -  -  X-  X-  45      $ )a  Get the rgb value for the given `angle` and the `absolute` value

Parameters
----------
angle : float
    The angle in radians
absolute : float
    The absolute value of the gradient

Returns
-------
array_like
    The rgb value as a tuple with values [0..1]
r   r   )r   r   r
   )angleabsolutemax_abss      r"   vector_to_rgbr      sf    " FRUU1WE1RUU7OEqy255uag(8(:JKLLr$   c                     [         R                  " SSS9n Sn[        R                  " SS[        R                  -  U5      n[        R                  " SSU5      n[        R
                  " X25      u  pE[        R                  " [        [        [        UR                  R                  5       UR                  R                  5       [        R                  " UR                  R                  5       5      5      5      5      nUR                  XS45      nU R                  X#US S 2S S 2S	4   US
S9nUR                  S 5        U R!                  / 5        [         R"                  " 5         g )N   polar)
projection   r   r   g      ?r&   r   auto)colorshading)r   subplotr   rn   r   meshgridr*   listmapr   Tr   	ones_liker+   
pcolormesh	set_arrayset_yticklabelsshow)	axntrrgtgccvms	            r"   generate_color_wheelr      s    	SW	-BA
Aqw"A
AsAA[[FB
c-"$$,,.2<<XZX\X\XdXdXfKghijA	
A!9	B
aBq1uIQ?AKKrHHJ
r$   )!openpivr   r   r   r   r   r   r   pandaspdscipy.interpolater   
matplotlibr	   r   matplotlib.colorsr
   r   skimager   skimage.drawr   r#   r=   r_   ri   r~   r   r   r   r   r   r    r$   r"   <module>r      s\    B B   & $ (   .4(&V436
((&&M0r$   