Skip to content
This repository was archived by the owner on Jul 8, 2026. It is now read-only.

LyCecilion/StaticFlow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

banner

StaticFlow

西安电子科技大学本科生物理实验「电流场模拟静电场实验」配套数据处理与可视化脚本

Python License uv

Warning

本项目是物理实验的一次性配套工具,不再额外维护,也不接受 Issue 和 Pull Request。


📖 About

本实验通过电流场模拟静电场,利用导体纸上的稳恒电流场来模拟真空中的静电场分布。实验分为两部分:

  • 实验一(同轴电缆):在印有同心圆极坐标网格的图纸上,通过探针测量等势点,用黑点标记。脚本从照片中自动提取黑点坐标,换算半径与角度,绘制等势线图并进行对数线性拟合。
  • 实验二(任意形状电极):在坐标纸上记录等势点坐标,脚本通过三角剖分插值生成连续的等势线,并绘制电场线(流线)。

✨ Features

  • 黑点自动提取 — 从极坐标图纸照片中自动识别黑色数据点,支持 Hough 圆变换定位、红墨印刷网格过滤、连通组件分析去噪
  • 数据透视与聚类 — 按角度聚合测量点,将长表转换为按角度射线组织的宽表,便于查看与分析
  • 等势线与电场线绘制 — 同轴电缆模型的对数线性拟合,以及任意电极的三角剖分插值 + 梯度流线生成
  • 命令行即用 — 所有脚本均提供完整的 CLI 参数,默认值针对标准实验条件设定,开箱即用

🚀 Quick Start

实验一:同轴电缆

# Step 1: 从照片提取黑点
python scripts/extract_black_points.py

# Step 2: 按角度透视
python scripts/pivot_black_points_by_angle.py

# Step 3: 绘制场图与拟合
python scripts/plot_coaxial_field.py

实验二:电场线与等势线

python scripts/plot_electric_field_and_equipotentials.py

所有输出文件位于 output/ 目录。

📦 Installation

  • Python ≥ 3.10
  • 包管理器uv(推荐)或 pip
# Clone 仓库
git clone https://github.com/LyCecilion/StaticFlow.git
cd StaticFlow

# 使用 uv 安装依赖
uv sync

# 或者使用 pip
pip install -r <(uv pip compile pyproject.toml -o -)

核心依赖:

用途
opencv-python 图像读取、圆检测、形态学操作、连通组件分析
numpy 数值计算、线性回归、梯度计算
matplotlib 全部图表绘制
pillow 辅助图像处理

📝 Usage

实验一:同轴电缆静电场描绘

1. 提取黑点数据

脚本scripts/extract_black_points.py

原理:从同轴电缆实验极坐标图纸的照片中,自动识别黑色数据点,计算每个点对应的角度和径向距离(cm)。

处理流程

  1. 圆检测 — 使用 Hough 圆变换定位极坐标图的外圆,结合径向密度剖面精修外圆半径
  2. 红墨过滤 — 在 HSV 色彩空间分离红色印刷网格线(hue < 10 或 > 170),避免误检
  3. 黑点提取 — 灰度阈值(默认 < 80)+ 形态学开运算去噪
  4. 连通组件分析 — 面积、宽高比、位置三重过滤,排除噪点
  5. 坐标换算 — 像素坐标 → 极坐标(角度、半径 cm)
python scripts/extract_black_points.py \
    --image example/RawDataOfCoaxialCableElectrostaticFieldExperiment.jpg \
    --csv output/black_points.csv \
    --debug-image output/black_points_debug.jpg \
    --outer-radius-cm 6.5 \
    --inner-radius-cm 1.0 \
    --allowed-angle-mode experiment \
    --radius-step-cm 0.2

主要参数

参数 默认值 说明
--image example/...jpg 输入照片路径
--csv output/black_points.csv 输出 CSV 路径
--debug-image output/black_points_debug.jpg 标注后的调试图片
--outer-radius-cm 6.5 外圆物理半径(cm)
--inner-radius-cm 1.0 内圆物理半径(cm)
--allowed-angle-mode experiment 角度吸附模式:experiment(30°/45° 倍数)或 uniform(均匀步长)
--angle-step-deg 5.0 uniform 模式下的角度步长(°)
--radius-step-cm 0.2 半径吸附网格(cm)— 现已改为直接四舍五入到两位小数
--black-threshold 80 黑色灰度阈值(0-255,低于此值视为黑点)
--red-saturation-threshold 80 红色饱和度阈值
--min-area / --max-area 15 / 220 连通组件面积范围(px²)

输出 CSV 字段

字段 说明
index 点序号
angle_deg 真实角度(°)
angle_deg_snapped 吸附后的角度(°)
radius_cm 原始半径(cm)
radius_cm_snapped 四舍五入到两位小数的半径(cm)
ring_2mm 所在 2mm 环编号
radius_px 半径(px)
x_px, y_px 像素坐标
area_px 连通组件面积(px²)

2. 按角度透视数据

脚本scripts/pivot_black_points_by_angle.py

原理:将第一步输出的长表(每个点一行)转换为宽表(每列一条角度射线,每行一个半径环上的值),方便阅读和后续处理。

处理流程

  1. 角度聚类 — 按真实角度排序后,以 --cluster-gap-deg 为阈值将同一条射线上的点聚合为一个 cluster
  2. 代表角度投票 — 每个 cluster 内对 snapped 角度做多数投票
  3. 透视输出 — 按角度排序,输出 angle_0, angle_30, angle_60, ... 列 + average
python scripts/pivot_black_points_by_angle.py \
    --input output/black_points.csv \
    --output output/black_points_by_angle.csv

主要参数

参数 默认值 说明
--input output/black_points.csv 第一步输出的 CSV
--output output/black_points_by_angle.csv 透视输出路径
--cluster-gap-deg 10.0 角度聚类阈值(°),相邻点角度差小于此值视为同一射线
--expected-values-per-angle 7 每列期望点数(用于异常检测)

3. 绘制场图与对数拟合

脚本scripts/plot_coaxial_field.py

原理:读取透视后的数据,生成两张图:

  1. 等势线分布图coaxial_field_plot.png)— 在笛卡尔坐标下绘制各等势环和电场方向箭头
  2. 对数半径-相对电位图coaxial_log_radius_plot.png)— 绘制实测 $\ln r$–$U_r$ 关系,与理论直线对比,并对实测数据进行线性拟合

理论依据:同轴电缆模型中,电势 $U$ 与径向距离 $r$ 满足: $$U(r) = U_0 \frac{\ln(r_2/r)}{\ln (r_2/r_1)}$$

$\ln r$ 与相对电位呈线性关系。

python scripts/plot_coaxial_field.py \
    --input output/black_points_by_angle.csv \
    --inner-radius-cm 1.0 \
    --outer-radius-cm 6.5

主要参数

参数 默认值 说明
--input output/black_points_by_angle.csv 透视后的 CSV
--field-output output/coaxial_field_plot.png 等势线图输出
--log-output output/coaxial_log_radius_plot.png 对数拟合图输出
--inner-radius-cm 1.0 内电极半径(cm)
--outer-radius-cm 6.5 外电极半径(cm)
--angle-convention math 角度约定:math(0° 指向 +x)或 chart(0° 指向下方)
--field-line-angles-deg 0,45,90,...,315 场线箭头角度
--dpi 200 输出分辨率

实验二:电场线与等势线描绘

4. 绘制电场线与等势线

脚本scripts/plot_electric_field_and_equipotentials.py

原理:给定坐标纸上记录的等势点坐标,通过三角剖分插值生成连续标量场,再计算梯度得到电场方向,最终绘制等势线和电场流线。

处理流程

  1. 三角剖分插值 — 对离散测量点做 Delaunay 三角剖分 + 线性插值,得到网格化的电势场
  2. 梯度计算$\vec{E} = -\nabla V$,用 np.gradient 计算电场分量
  3. 等势线contour 按实际电压值绘制等势线并标注
  4. 电场流线streamplot 从左侧均匀起始点出发,沿电场方向绘制流线
python scripts/plot_electric_field_and_equipotentials.py \
    --input example/electric_field_points.csv \
    --output output/electric_field_and_equipotentials.png

主要参数

参数 默认值 说明
--input example/electric_field_points.csv 等势点坐标 CSV
--output output/electric_field_and_equipotentials.png 输出图像路径
--grid-size 240 插值网格分辨率
--field-line-count 5 电场流线条数
--stream-linewidth 0.9 流线宽度
--stream-arrowsize 0.8 流线箭头大小
--dpi 200 输出分辨率

输入数据格式

同轴电缆实验

直接使用极坐标图纸的 照片(JPEG/PNG),脚本自动检测图表几何参数。

电场线实验

CSV 格式,包含以下列:

列名 说明
Voltage(V) 电势值(V)
Point_Index 该电压等级下的点序号
X_Coordinate X 坐标
Y_Coordinate Y 坐标

示例(example/electric_field_points.csv):

Voltage(V),Point_Index,X_Coordinate,Y_Coordinate
3,1,10.60,7.80
3,2,10.90,6.00
...
7,10,2.85,1.60

⚙️ Configuration

所有脚本均通过命令行参数配置,使用 --help 查看完整参数列表。各脚本的默认值针对标准实验条件设定,可直接运行。

字体说明

本项目图表使用 思源宋体(Source Han Serif SC)作为主字体,数学公式使用 Computer Modern 字体(matplotlib 内置 mathtext 渲染)。如系统未安装思源宋体,matplotlib 将自动 fallback 到微软雅黑等中文字体。

📁 Project Structure

StaticFlow/
├── example/                          # 示例输入数据
│   ├── RawDataOfCoaxialCableElectrostaticFieldExperiment.jpg
│   └── electric_field_points.csv
├── scripts/                          # 所有脚本
│   ├── extract_black_points.py       # 从照片提取黑点
│   ├── pivot_black_points_by_angle.py # 按角度透视黑点数据
│   ├── plot_coaxial_field.py         # 同轴电缆场图与对数拟合
│   └── plot_electric_field_and_equipotentials.py  # 电场线与等势线
├── output/                           # 输出目录(gitignore)
├── pyproject.toml
├── uv.lock
└── README.md

📄 License

MIT © LyCecilion

About

[🏁|🎓] 西安电子科技大学本科生物理实验「电流场模拟静电场实验」配套数据处理与可视化脚本

Resources

Stars

Watchers

Forks

Contributors

Languages