ficombine — 图像合并

WASM 版 fitsh/ficombine。将多张 FITS 天文图像按指定算法合并为一张,支持 11 种合并模式和 3 种像素忽略条件。所有 FITS 读写均通过 cfitsio/ 统一模块。

输入

参数

Combination Mode(合并模式)

模式说明额外参数
mean像素均值—
median像素中值—
min像素最小值—
max像素最大值—
sum像素求和—
squaresum像素平方和—
scatter像素散度(标准差)—
rejmedSigma 拒绝中值iterations & sigma
rejmeanSigma 拒绝均值iterations & sigma
truncated截断均值(丢弃极值后取均值)discard lowest & highest
winsorizedWinsorized 均值(极值替换为邻近值后取均值)discard lowest & highest

Rejection Parameters(拒绝参数)

仅 rejmed 和 rejmean 模式显示:

参数默认值对应 C 字段说明
iterations2niterSigma 拒绝迭代次数
sigma3.0lower & upper拒绝阈值(sigma 倍数,同时设置上下限)

Truncation / Winsorization Parameters

仅 truncated 和 winsorized 模式显示:

参数默认值对应 C 字段说明
discard lowest1lowest每像素丢弃的最低值个数
discard highest1highest每像素丢弃的最高值个数

当两个值相同时,模式字符串中使用 discard=N 简写;不同时使用 lowest=N,highest=M。

Ignore Flags(忽略标志)

选项C 标志位说明
ignore negativeCOM_IGNORE_NEGATIVE (0x01)忽略负值像素(标记为 MASK_FAULT 后排除)
ignore zeroCOM_IGNORE_ZERO (0x02)忽略零值像素
ignore positiveCOM_IGNORE_POSITIVE (0x04)忽略正值像素

所有标志可多选,通过逗号追加到模式字符串(如 mean,ignorenegative,ignorezero)。

输出

测试数据

测试 5 张 FITS 图像位于 testdata/ 目录:

testdata/
├── ficombine_test_img1.fits  (2560×2560)
├── ficombine_test_img2.fits  (2560×2560)
├── ficombine_test_img3.fits  (2560×2560)
├── ficombine_test_img4.fits  (2560×2560)
└── ficombine_test_img5.fits  (2560×2560)

测试步骤:

  1. 点击文件选择,一次性选择全部 5 张图像(Ctrl/Cmd+A)
  2. 确认文件列表显示 5 images / 2560×2560
  3. 选择模式 mean,点击 Combine
  4. 结果应显示合并后的图像,下载的 FITS 与系统 CLI 输出对比,max diff < 1e-4

WASM 编译与验证

编译

项目值
C 源文件9 个(1 ficombine_core + 8 algorithms) + 1 cfitsio wrapper
FITS 写入fitsio_wrap.c(来自 cfitsio/)
静态链接libcfitsio.a + zlib (10 .c)
WASM 大小827 KB
依赖算法模块combine, image, mask, tensor, statistics, stubs, str
math 依赖无

ccall 入口

函数参数数用途
combine_parse_mode_simple2解析合并模式字符串 → 填充 combine_parameters 结构体
ficombine_apply7内存中合并图像,返回 ficombine_result*(含 data / mask / sx / sy)
ficombine_result_free1释放结果内存
writeDoubleFits5通过 cfitsio 将 double 数组写为 FITS 文件(MEMFS)

精度验证

测试模式max diff容差结果
基本 5 模式mean / median / min / max / sum2.44e-41e-3✅ 全部通过
mask 10 组随机ignorenegative / ignorezero / rejmed / rejmean / truncated / winsorized1.22e-41e-4✅ 10/10 通过

完整验证报告见 tmp/tempficombine/report.md。

已知限制

外部 mask 文件(-M 参数)不支持。 CLI 的 -M 功能为"将 mask 加入输出",非"用 mask 排除像素"。ficombine_apply 的 masks 参数与 combine_lines 内部布局不兼容,传 NULL 绕过。ignore flag 已覆盖像素排除需求。
Combined 按钮被 JS9 全局事件拦截。 JS9 在 document 上注册了 mousedown 事件并调用 preventDefault(),导致按钮的 onclick/onmousedown 失效。修复方案:capture 阶段 + getBoundingClientRect 坐标匹配,绕过 JS9 事件拦截。按钮启用/禁用使用 CSS class .btn-disabled 控制,不使用浏览器原生的 disabled 属性。

文件结构

ficombine/
├── index.html              ← 页面布局(多图上传 + 模式面板 + JS9 显示)
├── app.js                  ← 主线程(cfitsio 读取 + 多图管理 + Worker 通信 + 按钮修复)
├── ficombine_worker.js     ← Worker(ficombine_apply + writeDoubleFits + MEMFS)
├── ficombine.js            ← WASM 绑定(827 KB 含 cfitsio+zlib)
├── ficombine.wasm
├── style.css               ← 页面样式
├── README.html             ← 本文件
├── testdata/               ← 测试图像
└── astroemw.js / .wasm     ← JS9 FITS 模块(动态加载,本地副本)

FITS 读写规范(统一模块)

所有 fitsh 程序通过 cfitsio/ 统一读写 FITS:

相关文档

ICP备案号:苏ICP备2024070404号   苏公网安备32011302320896