Manuscript Statistics Audit
Yuan1z0825/nature-skills
Audits or rewrites the statistical reporting in a manuscript: experimental units, replication, tests, uncertainty and figure legends, without inventing missing details.
Performs Particle Image Velocimetry (PIV) analysis with OpenPIV.
$ npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install K-Dense-AI/scientific-agent-skills openpiv --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/openpiv .claude/skills/openpiv && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "openpiv" agent skill from https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpiv into .claude/skills/openpiv/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openpiv", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpivType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install K-Dense-AI/scientific-agent-skills openpiv --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/openpiv .agents/skills/openpiv && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "openpiv" agent skill from https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpiv into .agents/skills/openpiv/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openpiv", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install K-Dense-AI/scientific-agent-skills openpiv --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/openpiv .cursor/skills/openpiv && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "openpiv" agent skill from https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpiv into .cursor/skills/openpiv/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openpiv", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/K-Dense-AI/scientific-agent-skills.git --path skills/openpiv--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install K-Dense-AI/scientific-agent-skills openpiv --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/openpiv .gemini/skills/openpiv && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "openpiv" agent skill from https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpiv into .gemini/skills/openpiv/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openpiv", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install K-Dense-AI/scientific-agent-skills openpivInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/openpiv .github/skills/openpiv && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "openpiv" agent skill from https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpiv into .github/skills/openpiv/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openpiv", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install K-Dense-AI/scientific-agent-skills openpiv --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/openpiv .opencode/skills/openpiv && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "openpiv" agent skill from https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/openpiv into .opencode/skills/openpiv/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openpiv", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
openpivPerforms Particle Image Velocimetry (PIV) analysis with OpenPIV.
Openpiv is an agent skill from K-Dense-AI/scientific-agent-skills. Performs Particle Image Velocimetry (PIV) analysis with OpenPIV. Use when extracting velocity fields from PIV image pairs, analyzing fluid dynamics or flow visualization experiments, cross-correlating interrogation windows, validating and replacing spurious PIV vectors, or computing vorticity, strain rate, and turbulence statistics from measured velocity fields.
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `references/advanced_algorithms.md`, `scripts/__init__.py` and `scripts/analyze.py`). Compatibility notes: Requires Python 3.10+ with openpiv installed (uv pip install openpiv). numpy, scipy, scikit-image, and matplotlib arrive as dependencies. No network access…
It sits in Research & Science, covering Physical and earth sciences and Statistics. The repository describes itself as: Turn any AI agent into an AI Scientist. The 1 Agent Skills library for science, used by 250,000+ scientists worldwide. 177 ready-to-use validated skills plus 100+ scientific… The licence is BSD-3-Clause.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 92ace75. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditBashFrom allowed-tools in the SKILL.md frontmatter.
Ships 4 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
pythonuvFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
openpiv.readthedocs.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires Python 3.10+ with openpiv installed (uv pip install openpiv). numpy, scipy, scikit-image, and matplotlib arrive as dependencies. No network access needed after install.
From compatibility in the SKILL.md frontmatter.
Openpiv loads about 4.8k tokens when it runs, and up to ~8.6k if it reads all its reference files. Until then it costs about 93 tokens; SKILL.md has 1,430 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Write, Edit, BashAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from K-Dense-AI/scientific-agent-skills at commit 92ace75, republished under its BSD-3-Clause licence (© K-Dense-AI). 1,430 words, ~4,755 tokens.
.claude/skills/openpiv/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.OpenPIV (Open Particle Image Velocimetry) analyzes fluid flow from PIV image pairs. It covers preprocessing, cross-correlation, vector validation, outlier replacement, smoothing, and scaling to physical units.
Targets openpiv 0.26.1. Synthetic checks ran on Python 3.13, NumPy 2.5.3, SciPy 1.18.1,
scikit-image 0.26.0, and Matplotlib 3.11.2. Rust was not installed; use backend="scipy" for the
tested path. See review evidence.
Use this skill when working with experimental PIV or flow-visualization image pairs: measuring 2D velocity fields, tuning interrogation-window parameters, validating vectors, or deriving vorticity, strain rate, and turbulence statistics. For simulating flow rather than measuring it, use a CFD skill instead.
Install OpenPIV:
uv pip install openpiv
# Pin it when the analysis needs to be reproducible -- this is the version every
# snippet below was checked against.
uv pip install "openpiv==0.26.1"Run PIV analysis on an image pair:
import numpy as np
from openpiv import tools, pyprocess, validation, filters, scaling
frame_a = tools.imread("image_a.bmp")
frame_b = tools.imread("image_b.bmp")
# Always returns (u, v, s2n); s2n is all NaN if sig2noise_method=None.
u, v, s2n = pyprocess.extended_search_area_piv(
frame_a.astype(np.float32),
frame_b.astype(np.float32),
window_size=32,
overlap=12,
dt=0.02,
search_area_size=38,
correlation_method="linear", # circular also supports extended search
normalized_correlation=True,
backend="scipy",
sig2noise_method="peak2peak",
)
x, y = pyprocess.get_coordinates(
image_size=frame_a.shape,
search_area_size=38,
overlap=12,
center_on_field=False, # matches sliding-window positions
)
# flags is a boolean array: True marks a spurious vector.
flags = validation.sig2noise_val(s2n, threshold=1.05) | ~np.isfinite(s2n)
flags |= ~np.isfinite(u) | ~np.isfinite(v)
u, v = filters.replace_outliers(u, v, flags, method="localmean", max_iter=3, kernel_size=2)
# Scale, then convert to right-handed image-boundary coordinates.
x, y, u, v = scaling.uniform(x, y, u, v, scaling_factor=96.52)
y, v = frame_a.shape[0] / 96.52 - y, -v
tools.save("vectors.txt", x, y, u, v, flags)Or use the bundled CLI, which also checks inputs and preserves masks and processing parameters:
python skills/openpiv/scripts/runner.py \
--image frame_a.bmp --image frame_b.bmp --output_dir results --verboseParticle Image Velocimetry is an optical method for measuring fluid velocity by tracking illuminated tracer particles between two images.
Process flow:
frame_a, frame_b) separated by a known time dt.window_size — correlation window in pixels (typically 16–128). Larger windows give better
correlation but coarser spatial resolution.
overlap — pixels shared between adjacent windows (typically 50–75% of window_size). Higher
overlap raises vector density and cost, but adjacent vectors become correlated rather than
independent.
search_area_size — the window searched in the second frame. Must be ≥ window_size; a few
pixels larger accommodates larger displacements. Both "circular" and "linear" support extended
search. The CLI chooses zero-padded "linear" with normalized_correlation=True for it; this
does not recover arbitrary displacement or eliminate spurious peaks. Grid stride is
search_area_size - overlap, so overlap must be smaller than the search area.
Rules of thumb: keep the largest displacement under about a quarter of window_size, and aim for
5–10 particles per window.
s2n measures how distinct the correlation peak is. sig2noise_method controls how it is computed —
"peak2mean" (the function default) or "peak2peak". The two are on different scales, so a
threshold tuned for one is meaningless for the other. Typical peak2peak thresholds are 1.05–1.3.
flags = validation.sig2noise_val(s2n, threshold=1.05)
# flags is bool: True == spurious. `~flags` selects the good vectors.Masking lives in openpiv.preprocess and returns (image, mask). Use floating-point copies
to avoid unsigned subtraction artifacts. Inspect masks on both frames before analysis.
from openpiv import preprocess
# Intensity masking uses Otsu; the threshold argument is for edges.
frame_a_masked, mask_a = preprocess.dynamic_masking(
frame_a.astype(np.float64), method="intensity", filter_size=7, threshold=0.005
)
frame_b_masked, mask_b = preprocess.dynamic_masking(
frame_b.astype(np.float64), method="intensity", filter_size=7, threshold=0.005
)Preserve the union mask_a | mask_b as excluded physical regions. The CLI samples it at
interrogation centers, saves it, and keeps those velocities NaN after replacement. Windows
straddling an object can still be biased: inspect/dilate masks for the experiment. In 0.26.1
method="edges" indexes with uint8 instead of bool, potentially corrupting the image or failing.
The CLI refuses it; use intensity masking or a verified boolean mask in a custom workflow.
Multi-pass (window deformation) lives in openpiv.windef, driven by a PIVSettings dataclass.
pyprocess has no multi-pass entry point.
import numpy as np
from openpiv import scaling, windef
settings = windef.PIVSettings(
windowsizes=(64, 32, 16), overlap=(32, 16, 8), num_iterations=3,
backend="scipy", sig2noise_method="peak2peak", sig2noise_threshold=1.05,
)
x, y, u, v, flags = windef.simple_multipass(
frame_a.astype(np.float32), frame_b.astype(np.float32), settings
)
# Output is in PIXELS PER FRAME -- convert yourself. scaling.uniform only divides
# by scaling_factor, so apply dt separately.
dt = 0.02
x, y, u, v = scaling.uniform(x, y, u, v, scaling_factor=96.52)
u, v = u / dt, v / dtsimple_multipass validates, replaces outliers, fills remaining NaNs with zeros, and transforms
coordinates. Keep its flags: repaired/zero-filled output is not an independent measurement.
Always pass settings: its no-settings path has two window sizes but three iterations in 0.26.1.
Units trap: simple_multipass and its alias multigrid_windef ignore settings.dt and
settings.scaling_factor; convert their arrays as above. Batch windef.piv(settings) applies
both before saving — do not scale its files again. The simple wrapper does not honor all batch
preprocessing/output switches.
For control over individual passes, windef.first_pass and windef.multipass_img_deform are the
lower-level building blocks.
Every validator returns a boolean array where True marks a spurious vector. Also reject
nonfinite u, v, and s2n: sig2noise_val alone does not flag NaN.
# Signal-to-noise
flags = validation.sig2noise_val(s2n, threshold=1.05)
# Global range -- takes (min, max) TUPLES, positionally or as u_thresholds/v_thresholds.
flags = validation.global_val(u, v, (-300, 300), (-300, 300))
# Local median -- u_threshold and v_threshold are REQUIRED; size is the neighbourhood half-width.
flags = validation.local_median_val(u, v, u_threshold=30.0, v_threshold=30.0, size=1)
# Combine with boolean OR (not np.maximum -- these are bool arrays).
flags = (
validation.sig2noise_val(s2n, threshold=1.05)
| validation.global_val(u, v, (-300, 300), (-300, 300))
| validation.local_median_val(u, v, u_threshold=30.0, v_threshold=30.0)
)Set these thresholds in the units of u and v, not in pixels per frame.
extended_search_area_piv divides by dt, so with dt=0.02 a 3 px/frame displacement arrives as
150 px/s. The thresholds above suit that case; the (-30, 30) figure that PIV literature and
PIVSettings.min_max_u_disp use is a px/frame limit, and applying it to px/s output rejects the
entire field. Correlate with dt=1 to validate displacements before conversion, or adjust
thresholds to the actual velocity units (including both time and calibration factors).
u, v = filters.replace_outliers(
u, v, flags, method="localmean", max_iter=3, tol=1e-3, kernel_size=2
)method accepts "localmean", "disk", or "distance"; an invalid name raises ValueError
when filling missing cells. Use kernel_size>=2 for "distance": size 1 truncates all neighbor
weights to zero in 0.26.1 and leaves holes. Replacement fills the flagged
positions with interpolated values — if you then overwrite them with NaN, the replacement was
wasted. Choose one or the other:
# Keep flagged vectors out of the analysis entirely, instead of interpolating them.
u = np.where(flags, np.nan, u)
v = np.where(flags, np.nan, v)Smoothing is openpiv.smoothn.smoothn; there is no openpiv.smooth module. It returns a tuple
whose first element is the smoothed field. NaN/Inf are missing observations; supply a copy because
it can modify input. Zero-filling holes first incorrectly treats them as measured zeros.
from openpiv.smoothn import smoothn
u_smooth, *_ = smoothn(np.asarray(u, dtype=float).copy(), s=0.5) # larger == smoother
v_smooth, *_ = smoothn(np.asarray(v, dtype=float).copy(), s=0.5)
u_smooth = np.asarray(u_smooth)display_vector_field reads a saved vectors file and calls plt.show() internally, so select a
non-interactive backend for batch runs.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from openpiv import tools
fig, ax = plt.subplots(figsize=(8, 8))
tools.display_vector_field(
"vectors.txt",
ax=ax,
scaling_factor=96.52, # same factor used in scaling.uniform, to map back onto the image
scale=50,
width=0.0035,
on_img=False,
)
image = tools.imread("frame_a.bmp")
height, width = image.shape
ax.imshow(image, cmap="gray", origin="upper", zorder=-1,
extent=(0, width / 96.52, 0, height / 96.52))
fig.savefig("vector_field.png", dpi=150, bbox_inches="tight")
plt.close(fig)Set image extents explicitly: the helper's on_img=True infers them from the last vector and
can stretch overlays when windows leave unused margins. The CLI plots with the actual image bounds.
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
mag = np.sqrt(u**2 + v**2)
for ax, field, title, cmap in [
(axes[0], mag, "Velocity Magnitude", "viridis"),
(axes[1], u, "U Velocity", "RdBu_r"),
(axes[2], v, "V Velocity", "RdBu_r"),
]:
im = ax.imshow(field, cmap=cmap)
ax.set_title(title)
plt.colorbar(im, ax=ax)
fig.tight_layout()
fig.savefig("velocity_components.png")
plt.close(fig)scripts/analyze.py bundles these against a params.npz written by runner.py. It infers the
physical grid spacing from the saved coordinates, so the derivatives come out per unit length:
import sys
sys.path.insert(0, "skills/openpiv/scripts")
from analyze import PIVAnalyzer
piv = PIVAnalyzer("results/params.npz")
vorticity = piv.compute_vorticity() # dv/dx - du/dy
exx, eyy, exy = piv.compute_strain()
stats = piv.compute_statistics() # excludes flagged and masked vectors
piv.plot_vector_field(save_path="quiver.png")The standalone forms, if you would rather compute them inline:
def compute_vorticity(u, v, dx=1.0, dy=None):
"""Out-of-plane vorticity dv/dx - du/dy. Pass the physical grid spacing, not 1.0."""
dy = dx if dy is None else dy
return np.gradient(v, dx, axis=1) - np.gradient(u, dy, axis=0)For the single-pass extended-search grid, spacing is
(search_area_size - overlap) / scaling_factor in physical units; it reduces to
(window_size - overlap) / scaling_factor only when the two window sizes match.
Prefer differences of the saved x and y coordinates, especially after multipass
processing. Leaving dx=1.0 yields vorticity per grid cell, not per unit length.
See OpenPIV coordinate generation.
Sign convention: the CLI writes y = image_height / scaling_factor - y and negates v,
keeping rows in image order. Saved y decreases down the array. The standalone forms need
signed dy (negative here), or use PIVAnalyzer, which reads orientation. Positive dy changes
the y-derivative contribution and can even cancel real rotation.
def compute_strain(u, v, dx=1.0, dy=None):
"""Return (exx, eyy, exy) of the 2D strain-rate tensor."""
dy = dx if dy is None else dy
du_dx = np.gradient(u, dx, axis=1)
du_dy = np.gradient(u, dy, axis=0)
dv_dx = np.gradient(v, dx, axis=1)
dv_dy = np.gradient(v, dy, axis=0)
return du_dx, dv_dy, 0.5 * (du_dy + dv_dx)def compute_statistics(u, v):
"""Single-frame spatial statistics. NOT Reynolds decomposition."""
u_prime = u - np.nanmean(u)
v_prime = v - np.nanmean(v)
rms_u, rms_v = np.nanstd(u_prime), np.nanstd(v_prime)
return {
"u_mean": np.nanmean(u),
"v_mean": np.nanmean(v),
"rms_u": rms_u,
"rms_v": rms_v,
"tke": 0.5 * (rms_u**2 + rms_v**2),
}Caveat: subtracting the spatial mean of one frame measures spatial variance, which equals
turbulent intensity only under justified homogeneity/ergodicity assumptions. Reynolds decomposition
needs an ensemble: subtract its mean field from each realization. The legacy tke key is only
two-component spatial variance energy, not full turbulent kinetic energy. The analyzer excludes
flagged vectors by default; compute_statistics(include_interpolated=True) includes repaired ones.
# Basic run
python skills/openpiv/scripts/runner.py \
--image img1.bmp --image img2.bmp --output_dir results --verbose
# Tuned parameters with dynamic masking
python skills/openpiv/scripts/runner.py \
--image frame_a.bmp \
--image frame_b.bmp \
--output_dir results \
--window_size 32 \
--overlap 12 \
--search_area 38 \
--dt 0.02 \
--scaling 96.52 \
--threshold 1.05 \
--mask dynamic \
--mask_method intensity \
--verbose| Option | Default | Description |
|---|---|---|
--image | required | Image file; specify exactly twice for the pair |
--output_dir | results | Output directory (created if absent) |
--window_size | 32 | Interrogation window size (px) |
--overlap | 12 | Search-grid overlap (px), nonnegative and less than search area |
--search_area | 38 | Search area size (px), must be ≥ --window_size |
--dt | 0.02 | Time between frames (s) |
--scaling | 96.52 | Scaling factor, pixels per physical unit (e.g. px/mm) |
--threshold | 1.05 | peak2peak signal-to-noise threshold |
--mask | none | none or dynamic (openpiv.preprocess.dynamic_masking) |
--mask_method | intensity | Only intensity is usable in 0.26.1; edges is refused |
--backend | scipy | scipy, auto, or rust; Rust requires its extension |
--drop_invalid | off | NaN out flagged vectors instead of keeping interpolated values |
--verbose | off | Print progress messages |
Verify an install end to end against OpenPIV's own bundled image pair:
python skills/openpiv/scripts/run_example.py --output_dir /tmp/openpiv-demo%.4e formatted, with a # x y u v flags mask comment headerx, y, u, v, flags, mask, s2n, timing/calibration/window parameters,
requested backend, and OpenPIV version. Coordinates use physical units; velocity uses units/s.# x y u v flags mask
2.1757e-01 3.5226e+00 -6.2220e-02 -2.7081e+00 0.0000e+00 0.0000e+00
4.8695e-01 3.5226e+00 -3.1587e-01 -2.9800e+00 0.0000e+00 0.0000e+00flags is float, 0 for valid and 1 for flagged. mask=1 marks an excluded object region,
independently of flags. Preserve both with the measured field.
sig2noise_method.96.52 in OpenPIV's test1 tutorial data is px/mm).s2n distribution — a low median means poor correlation, not a bad threshold.windef) for flows with large velocity gradients or displacements.advanced_algorithms.md — correlation and subpixel methods, multi-pass window deformation,
PIVSettings fields, 3D and phase-separation modulesLoad the reference when detailed algorithm or settings information is needed.
© K-Dense-AI, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts, references) in skills/openpiv of K-Dense-AI/scientific-agent-skills.
Open the folder on GitHubat commit 92ace75
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in K-Dense-AI/scientific-agent-skills, which our catalogue first saw on October 7, 2026.
Openpiv next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Openpiv this skillK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~4.8k | Automated safety check: Notes | BSD-3-Clause | |
| Manuscript Statistics AuditYuan1z0825/nature-skills | 47k | 2 repos | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| JS Perf InvestigationSAP/project-foxhound | 180 | 2 repos | ~4.1k | Automated safety check: Pass | GPL-3.0 | |
| Math Modeling SolverLupynow/math-modeling-skills | 415 | — | ~2.1k | Automated safety check: Pass | MIT | |
| Academic Paper Reproduction Methodologyxjtulyc/MedgeClaw | 617 | 1 repos | ~1.3k | Automated safety check: Pass | None | |
| Data Scientistmagnus919/hermes-profiles | 289 | — | ~3.3k | Automated safety check: Pass | MIT |
Yuan1z0825/nature-skills
Audits or rewrites the statistical reporting in a manuscript: experimental units, replication, tests, uncertainty and figure legends, without inventing missing details.
SAP/project-foxhound
Structured performance opportunity investigation for SpiderMonkey (the Firefox JavaScript engine).
Lupynow/math-modeling-skills
数学建模竞赛解题全流程指导。覆盖国赛(CUMCM)和美赛(MCM/ICM)全部题型(A-F),提供12种问题本质分析、95+场景模型决策矩阵、5本算法Cookbook、11本完整例题Playbook、22个Python+7个MATLAB可运行代码模板。与math-modeling-paper形成"解题→写作"配对。当用户提及建模思路、选什么模型、怎么建模、赛题求解、粘贴赛题文本、美赛/国赛题目分…
xjtulyc/MedgeClaw
Six-phase process for reproducing a published paper's results from provided data, from variable mapping and sample filtering through regression tables and a written report.
magnus919/hermes-profiles
PhD-level expertise in data science, statistics, and machine learning.
jinzhezenggroup/computational-chemistry-agent-skills
Prepares, validates and runs DP-GEN simplify jobs that thin out repeated or redundant DeepMD datasets, generating param.json and machine.json for local or scheduler runs.
K-Dense-AI/scientific-agent-skills
Estimates reaction fluxes inside cells from steady-state carbon-13 labeling data with a bundled mfapy-based solver, and reports which fluxes the data pin down.
K-Dense-AI/scientific-agent-skills
Plans, runs, and documents analytical method validation, verification, or transfer studies under ICH Q2(R2)/Q14, USP, ICH M10, CLSI EP, or ISO/IEC 17025.
K-Dense-AI/scientific-agent-skills
Runs Cantera constant-volume or constant-pressure ignition simulations and reports temperature-based ignition delay with mechanism provenance and checks.
K-Dense-AI/scientific-agent-skills
Predicts how small molecules bind to a protein with DiffDock, covering batch docking, pose ranking by confidence and checks on the results; not for binding affinity.
K-Dense-AI/scientific-agent-skills
Plans and audits runs of the HypoGeniC and HypoRefine packages, which propose hypotheses from labeled text datasets, with local checks before any model call.
K-Dense-AI/scientific-agent-skills
Organizes scope, controlled documents, risk files and traceability into draft evidence for human review against ISO 13485, 14971, 17025 and 15189.
Categories
Performs Particle Image Velocimetry (PIV) analysis with OpenPIV. Openpiv is an agent skill from K-Dense-AI/scientific-agent-skills. Performs Particle Image Velocimetry (PIV) analysis with OpenPIV.
Openpiv fits situations like: extracting velocity fields from PIV image pairs; analyzing fluid dynamics; flow visualization experiments; cross-correlating interrogation windows.
Run `npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a claude-code`. Or copy the skill folder (skills/openpiv in K-Dense-AI/scientific-agent-skills) into .claude/skills/openpiv in your project. Claude Code loads it when a task matches its description.
Run `npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a codex`. Or copy the skill folder (skills/openpiv in K-Dense-AI/scientific-agent-skills) into .agents/skills/openpiv in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add K-Dense-AI/scientific-agent-skills --skill openpiv -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/openpiv, .gemini/skills/openpiv, .github/skills/openpiv and .opencode/skills/openpiv in your project.
Going by SKILL.md and its folder, Openpiv needs Python for the scripts in its folder and the command-line tools its instructions call (python and uv). Our summary lists: Python 3. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash. Compatibility (from SKILL.md): Requires Python 3.10+ with openpiv installed (uv pip install openpiv). numpy, scipy, scikit-image, and matplotlib arrive as dependencies. No network access needed after install..
SKILL.md names 1 domain. As links in the text: openpiv.readthedocs.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Openpiv is published under the BSD-3-Clause licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Openpiv: Manuscript Statistics Audit (Yuan1z0825/nature-skills, 47k stars), JS Perf Investigation (SAP/project-foxhound, 180 stars), Math Modeling Solver (Lupynow/math-modeling-skills, 415 stars) and Academic Paper Reproduction Methodology (xjtulyc/MedgeClaw, 617 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
K-Dense-AI (a GitHub organization) maintains it in K-Dense-AI/scientific-agent-skills, which has 48,215 GitHub stars. The repository holds 153 skills in this directory. The repository was last updated on October 5, 2026.
Source: K-Dense-AI/scientific-agent-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.