← SkillSafe / PIV Desk

Is your PIV vector field worth reporting?

Drop a PIV image pair. Your browser runs the openpiv pipeline on it - cross-correlation, sub-pixel peaks, validation, outlier replacement, scaling, vorticity - free, nothing uploaded. A paid run then reviews what the field supports or writes the openpiv script that reproduces it.

Examples are synthetic pairs with a known true field, and each has a saved model run - the whole page, free.

Drop frame A here, or
Drop frame B here, or

Drop both files on either box and they are ordered by name. PNG (8/16-bit), uncompressed TIFF (8/16-bit), BMP and JPEG are read as openpiv's tools.imread reads them: greyscale stays as stored, colour goes through openpiv's rgb2gray. Nothing leaves your browser.

Or generate a synthetic pair with a known field
Uniform uses the peak displacement at the angle; shear runs from minus to plus the peak, top to bottom.
PIV settings (openpiv names; defaults are the skill's runner.py)
Scaling from a ruler or target in the image:

Validation thresholds are entered in px per frame and applied in px/s (divided by dt), the units openpiv's u and v are in at that point - the trap the skill warns about.

Drop two frames or generate a pair.
Run PIV first to price the review.

Your recent runs

What this does, and what it does not

Particle image velocimetry splits two exposures into interrogation windows, cross-correlates each pair of windows and reads the displacement from the correlation peak. The page follows openpiv 0.25.4 and the openpiv agent skill's runner.py step for step: extended_search_area_piv (with an extended search area both windows are intensity-normalised and frame A is masked to its central window; linear correlation zero-pads the FFT), a Gaussian sub-pixel fit, the peak2peak or peak2mean ratio, sig2noise_val and optionally global_val and local_median_val, replace_outliers, scaling.uniform, transform_coordinates and the skill's analyze.py. It was checked against openpiv on 526 image pairs (490 random synthetic pairs over window, overlap, search, correlation, sub-pixel, ratio, validation and replacement settings, and OpenPIV's own six test pairs): 175,631 of 175,637 raw vectors agreed within 0.001 px and the signal-to-noise ratios within 0.01%. The six that did not, and one flag, sit in the normalised path, where openpiv computes in single precision and a near-zero point beside the peak makes the fit sensitive; the page computes in double precision.

openpiv's own quirks are reproduced rather than fixed, and the page says so where they matter: its rgb2gray weights blue by 0.144 instead of 0.114; get_coordinates centres the labels on the image while the windows start at the corner, so each label can sit a few pixels off its window; the linear correlation plane loses one FFT column on the way back. Peak locking, the particle count and the quarter-window check are the page's own diagnostics. One image pair measures displacements in the light sheet - not out-of-plane motion, and not turbulence statistics, which need an ensemble. The paid run reads only what the browser computed and your notes, is told never to compute a new number, and the page checks every number it writes. Derived from the agent skill @k-dense-ai/openpiv (k-dense-ai/scientific-agent-skills; see the notice). No OpenPIV code or data is included.