
    |uh                         d dl mZmZmZmZmZ d dlZd dlZ	d dl
mZ d dlmZ d dlmZ d dlm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S )    )tools	pyprocess
validationfiltersscalingN)griddata)pyplot)
hsv_to_rgb)tqdm)feature)linec                 T   |dk    r(t          j        |                                 d           t          j        |                                 d          }t          j        |d         dk              }|d         d         }t          j        |d         |         d          d	z  }|S )
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1<<<J8JqMQ.//LQ#Ii
1i 81EEEdJO    c                    t          j        |           }|}t          j        g                               dd          }t	          d|j        d                   D ]}|d         |d         |d         }
}	}|d d dd|f         }|d d dd|f         }t          ||||	f|          }||	f||z  z   \  }}	|
|z   }
||	|
g}|d         |d         |g}t          j        ||f          }||fS )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31_*1-.. ? ?a.+a.+a.a1 !AaC+ AaC+$VVaU6JJJe'**!F1g)!,->q-A"E	="=>>
 ---r$   c           	      V   t          j        |                     t          j                  |                    t          j                  |d         |d         |d         |d         d          \  }}}t          j        | j        |d         |d                   \  }}|d         }t          j        ||	          }	t          j
        |||	d
|d         |d                   \  }
}t          j        |||
||d                   \  }}}}t          j        ||||          \  }}}}|||||	fS )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[   !:ry!!ry!!9%y!$<-$& & &BI $=-y!# # #DAq ./O+#% % %L %
B
#=)+ + +FB ?	1b" 013 3 3LAq"b .q!R<<LAq"baR%%r$   c                    | d d ddf                                          | d d ddf                                         }}| d d ddf                                          | d d ddf                                         }}| d d ddf                                          | d d ddf                                         }}||f||f||ffS )Nr   r   r   )minmax)r0   xminxmaxyminymaxzminzmaxs          r"   get_boundariesri   Y   s     1Q'++--qqq1u/E/I/I/K/K$D 1Q'++--qqq1u/E/I/I/K/K$D 1Q'++--qqq1u/E/I/I/K/K$D$<$d|33r$   c           
      h   |d         }| d         | d         }}| d         d         }t          j        |d         |d         |d         dz             }t          j        |d         |d         |d         dz             }g }	g }
t          |d         |d         z            5 }|dd         D ]]}|dd         D ]P}t          |||f||d         |d                   \  }}|	                    |           |                    d           Q^	 d d d            n# 1 swxY w Y   t          d	           |	|
fS )
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 ^[^FF	Q	B [6!9Xa[];;F[6!9Xa[];;F 
HQK+	,	,	, 2, 	 	BQrTl  #2BB<RXY]R^`fgv`w#x#x q#**=999 A	               

!""" 222s    A)DDDc                     t          j        | dd          \  }}}t          j        d|                                z  |                                |                                z
            dz  }|S )Nxyreflect)ordermoder   )r   structure_tensorr   arctan2mean)imgaxxaxyayydom_oris        r"   dominant_directionr   z   s[    ,SINNNMCcj388::

SXXZZ(?AAAEGNr$   c                    d}t          j        |                     t          j                  |d          \  }}}t          j        |||          \  }}t                              d|z  ||z
            dz  }||z
  ||z   |z   z  dz  }	t                              ||z             }
|
|
                                z  }
||	|
fS )zMOrientationJ'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  MCc -c3<<FB
--C#)
-
-
1CGR#&1
,C
**S3Y

C37799CS=r$   c           
         t          |           }t          d                    |dz  t          j        z                       | j        d         dz
  | j        d         dz
  }}d\  }}|}t          |||z
  t          j        |          z  z             }g }	t          |t          ||z
            |          D ]}
t          |||
z   |||
z             \  }}t          j
        |dz  |dz  z             }|	                    t          j        |                    dd          | ||f                             dd          f                     t          j        |	          S )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      sR   	H	%	%B	
1
8
8C
F
FGGG>!$Q&q(9!(;5EGWE5="&**4455E#eEk"2"2J?? b bgwwuW}EEBQQ''	6>>"Q+?+?R@P@X@XY[\]@^@^*_ ` `aaaa:&'''r$   c                    g }t          d| j        d                   D ]}| |d d df         }| |d d df         t          j        | |d d df                   dz  z
  dk    }|dd         |dd          z  }t          j        |dk              d         }t          j        ||                   }|                    |           t          j        d |D                       }|||k             }|S )Nr   r   r   r   Tc                     g | ]	}|D ]}|
S  r   ).0subr5   s      r"   
<listcomp>z(calculate_bandwidths.<locals>.<listcomp>   s%    "N"N"N#"N"NQ1"N"N"N"Nr$   )r,   r-   r   rb   r   diffro   r)   )	r   min_rod_diamwidth_data_array
line_indexr   gv_shiftchangeschange_indexwidthss	            r"   calculate_bandwidthsr      s   A.4Q788 ( (
!*QQQq.1$Z!^4rv>NzZ[Z[Z[\]~>^7_7_ab7bbfgg1R4.!""-x..q1-..''''z"N"N0@"N"N"NOO'(8<(GHr$   c                     |  t           j        dz  z   } | dt           j        z  z  } | dk     r| dt           j        z  z  } t          | dt           j        z  z  ||z  ||z  f          S )a3  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      sg    " FRU1WE1RU7OEqyy25uag(8(7:JKLLLr$   c                     t          j        dd          } d}t          j        ddt          j        z  |          }t          j        dd|          }t          j        ||          \  }}t          j        t          t          t          |j
                                        |j
                                        t          j        |j
                                                                                }|                    ||df          }|                     |||d d d d d	f         |d
          }|                    d            |                     g            t          j                     d S )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[AFB
c-"$,,..2<XZX\XdXdXfXfKgKghhiijjA	
Aq!9		B
aBqqq1uIQ??AKKrHJJJ
Fr$   )!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$   r"   <module>r      sf   B B B B B B B B B B B B B B         & & & & & & $ $ $ $ $ $ ( ( ( ( ( (                    . . .4(& (& (&V4 4 43 3 36  
  (( ( (&  &M M M0    r$   