本Python脚本处理恒容燃烧弹 (CVB) 中球形火焰的高速相机图像(.tif 格式),以确定非拉伸层流燃烧速度 (
- 图像处理: 将 .tif 图像转换为灰度,应用 Otsu 阈值分割,使用轮廓检测识别火焰边界,并拟合圆形以物理单位提取火焰半径。
- 数据预处理: 使用 Savitzky–Golay 滤波器平滑提取的半径-时间数据。
-
火焰速度计算: 计算表观火焰传播速度 (
$\text{S}_b$ ) 并将其转换为相对于未燃气体的火焰速度 ($\text{S}_u$ )。 -
拉伸率计算: 确定火焰拉伸率 (
$\text{K}$ )。 - Markstein 回归: 对 $\text{S}u$ 与 $\text{K}$ 进行线性回归,以获得 $\text{S}{L,0}$ (截距) 和 -$\text{L}$ (斜率)。
-
可视化: 生成原始和平滑火焰半径随时间变化的曲线图、$\text{S}_b$ 随时间变化的曲线图以及
$\text{S}_u$ 与拉伸率$\text{K}$ 带有回归线的曲线图。 - 数据输出: 将所有处理过的数据(时间、原始半径、平滑半径、$\text{S}_b$、$\text{S}_u$、$\text{K}$)保存到 CSV 文件。
- Python 3.8+
- 以下 Python 包:
numpypandasscipymatplotlibopencv-python(cv2)
-
创建虚拟环境 (推荐):
python -m venv lfs
-
激活虚拟环境:
source lfs/bin/activate # 在 Linux/macOS 上 # lfs\Scripts\activate # 在 Windows (Command Prompt) 上 # lfs\Scripts\Activate.ps1 # 在 Windows (PowerShell) 上
-
安装依赖项:
pip install -r requirements.txt
-
准备图像数据:
- 在
flame_image_analysis.py脚本所在的目录中创建一个名为flame_images的文件夹。 - 将您的球形火焰的高速相机
.tif图像序列放入flame_images文件夹中。请确保它们按时间顺序命名(例如,frame_0001.tif、frame_0002.tif等),以确保正确的时间排序。
- 在
-
配置参数:
- 打开
flame_image_analysis.py并导航到main()函数。 - 根据您的实验设置调整以下参数:
image_folder: 图像文件夹的路径 (默认值:'flame_images')。calibration_factor: 像素到米的转换因子 (例如,如果 1 像素 = 10 微米,则为1e-5)。frame_rate: 高速相机的帧率,单位为帧/秒 (Hz)。Tu: 未燃气体的初始温度,单位为开尔文 (K)。Tb: 绝热火焰温度,单位为开尔文 (K),来自平衡计算。window_length: Savitzky–Golay 滤波器的窗口长度。必须是奇数整数 (例如,11)。polyorder: Savitzky–Golay 滤波器的多项式阶数 (例如,3)。output_csv_filepath: 用于保存处理后数据的 CSV 文件名 (默认值:'processed_flame_data.csv')。
- 打开
-
运行脚本:
python flame_image_analysis.py
成功执行后,脚本将:
- 在控制台打印计算出的
非拉伸层流燃烧速度 (S_L0)和Markstein 长度 (L)。 - 显示三张图:
- 火焰半径 vs. 时间: 显示原始和 Savitzky–Golay 平滑后的半径数据。
- 表观火焰传播速度 (Sb) vs. 时间。
- 未燃火焰速度 (Su) vs. 拉伸率 (K): 包含数据点和 Markstein 关系的线性回归线。
- 创建一个名为
processed_flame_data.csv(或您指定的output_csv_filepath) 的 CSV 文件,其中包含time、raw_radius、smoothed_radius、Sb、Su和K列。
脚本被组织成几个模块化函数,以提高清晰度和可维护性:
extract_radius_from_images(image_folder, calibration_factor, frame_rate): 处理图像加载、处理(灰度、阈值、轮廓检测、圆形拟合),并将像素半径转换为物理半径。smooth_and_differentiate(time_data, radius_data, window_length, polyorder): 对半径数据应用 Savitzky–Golay 平滑,并计算导数以找出Sb。compute_speeds_and_stretch(sb_data, smoothed_radius_data, Tu, Tb): 根据导出的Sb和平滑半径计算Su和K。fit_markstein_relation(su_data, k_data): 对Su与K进行线性回归,以确定S_L0和L。plot_results(time_data, raw_radius_data, smoothed_radius_data, sb_data, su_data, k_data, regression_line): 生成并显示所有必需的图表。save_data_to_csv(filepath, time_data, raw_radius_data, smoothed_radius_data, sb_data, su_data, k_data): 将完整的处理后数据保存到 CSV 文件。