Appearance
PIV 粒子图像测速
基本原理
PIV(Particle Image Velocimetry)通过分析流体中示踪粒子在连续两帧图像中的位移,计算局部速度矢量。典型方法是把图像分成 interrogation windows,对相邻帧窗口做互相关,找到粒子群的平均位移。
PIV 输出的是速度矢量场,而不是单个目标的位置。后续还可以计算涡量、流线、湍流统计量和流场结构。
解决的问题
流体内部速度场很难用单点传感器完整测量。PIV 解决的是流场可视化和定量测量问题,可用于验证 CFD、研究涡结构、喷流、边界层、微流控和流固耦合。
应用场景
- 风洞和水槽实验中的速度场测量。
- 涡结构、尾流、湍流和边界层研究。
- 喷流、燃烧、微流控和生物流体。
- CFD 结果验证和模型校准。
- 流固耦合实验中的速度场和结构响应关联。
Python 库
| 工具 | 用途 |
|---|---|
openpiv-python | PIV 计算、窗口互相关、矢量场处理 |
PIVlab | MATLAB 生态的 PIV 工具,适合作为 GUI 工具参考 |
opencv-python | 图像读取、增强和视频处理 |
numpy / scipy | 数值处理和滤波 |
matplotlib | 速度矢量和流场可视化 |
最小示例
python
import numpy as np
from openpiv import tools, pyprocess, validation, filters, scaling
frame_a = tools.imread("frame_a.tif").astype(np.int32)
frame_b = tools.imread("frame_b.tif").astype(np.int32)
u, v, sig2noise = pyprocess.extended_search_area_piv(
frame_a,
frame_b,
window_size=32,
overlap=16,
dt=0.01,
search_area_size=64,
sig2noise_method="peak2peak"
)
x, y = pyprocess.get_coordinates(image_size=frame_a.shape, search_area_size=64, overlap=16)
u, v, mask = validation.sig2noise_val(u, v, sig2noise, threshold=1.3)
u, v = filters.replace_outliers(u, v, method="localmean", max_iter=3, kernel_size=2)
x, y, u, v = scaling.uniform(x, y, u, v, scaling_factor=1.0)
tools.save("velocity.txt", x, y, u, v, mask)这个示例展示 PIV 的核心流程:读入两帧、互相关、验证、替换异常矢量、保存速度场。
工程流程概览
示踪粒子布置 -> 图像采集 -> 窗口互相关 -> 速度矢量场 -> 异常矢量过滤 -> 物理解释和 CFD 对比。
