WASM 版 fitsh/ficombine。将多张 FITS 天文图像按指定算法合并为一张,支持 11 种合并模式和 3 种像素忽略条件。所有 FITS 读写均通过 cfitsio/ 统一模块。
| 模式 | 说明 | 额外参数 |
|---|---|---|
mean | 像素均值 | — |
median | 像素中值 | — |
min | 像素最小值 | — |
max | 像素最大值 | — |
sum | 像素求和 | — |
squaresum | 像素平方和 | — |
scatter | 像素散度(标准差) | — |
rejmed | Sigma 拒绝中值 | iterations & sigma |
rejmean | Sigma 拒绝均值 | iterations & sigma |
truncated | 截断均值(丢弃极值后取均值) | discard lowest & highest |
winsorized | Winsorized 均值(极值替换为邻近值后取均值) | discard lowest & highest |
仅 rejmed 和 rejmean 模式显示:
| 参数 | 默认值 | 对应 C 字段 | 说明 |
|---|---|---|---|
| iterations | 2 | niter | Sigma 拒绝迭代次数 |
| sigma | 3.0 | lower & upper | 拒绝阈值(sigma 倍数,同时设置上下限) |
仅 truncated 和 winsorized 模式显示:
| 参数 | 默认值 | 对应 C 字段 | 说明 |
|---|---|---|---|
| discard lowest | 1 | lowest | 每像素丢弃的最低值个数 |
| discard highest | 1 | highest | 每像素丢弃的最高值个数 |
当两个值相同时,模式字符串中使用 discard=N 简写;不同时使用 lowest=N,highest=M。
| 选项 | C 标志位 | 说明 |
|---|---|---|
| ignore negative | COM_IGNORE_NEGATIVE (0x01) | 忽略负值像素(标记为 MASK_FAULT 后排除) |
| ignore zero | COM_IGNORE_ZERO (0x02) | 忽略零值像素 |
| ignore positive | COM_IGNORE_POSITIVE (0x04) | 忽略正值像素 |
所有标志可多选,通过逗号追加到模式字符串(如 mean,ignorenegative,ignorezero)。
⬇ result.fits 下载完整 FITS 文件(Float64 精度)测试 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)
测试步骤:
mean,点击 Combine| 项目 | 值 |
|---|---|
| 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 依赖 | 无 |
| 函数 | 参数数 | 用途 |
|---|---|---|
combine_parse_mode_simple | 2 | 解析合并模式字符串 → 填充 combine_parameters 结构体 |
ficombine_apply | 7 | 内存中合并图像,返回 ficombine_result*(含 data / mask / sx / sy) |
ficombine_result_free | 1 | 释放结果内存 |
writeDoubleFits | 5 | 通过 cfitsio 将 double 数组写为 FITS 文件(MEMFS) |
| 测试 | 模式 | max diff | 容差 | 结果 |
|---|---|---|---|---|
| 基本 5 模式 | mean / median / min / max / sum | 2.44e-4 | 1e-3 | ✅ 全部通过 |
| mask 10 组随机 | ignorenegative / ignorezero / rejmed / rejmean / truncated / winsorized | 1.22e-4 | 1e-4 | ✅ 10/10 通过 |
完整验证报告见 tmp/tempficombine/report.md。
-M 功能为"将 mask 加入输出",非"用 mask 排除像素"。ficombine_apply 的 masks 参数与 combine_lines 内部布局不兼容,传 NULL 绕过。ignore flag 已覆盖像素排除需求。
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 模块(动态加载,本地副本)
所有 fitsh 程序通过 cfitsio/ 统一读写 FITS:
imstat.js / imstat.wasm(cfitsio WASM,主线程)fitsio_wrap.c(C wrapper,编译入各程序 WASM)../cfitsio/README.md — 统一 FITS 读写模块规范tmp/tempficombine/report.md — 编译与精度验证报告tmp/tempficombine/test.js — 5 模式命令行对比测试tmp/tempficombine/test_mask.js — 10 组 mask 功能对比测试