rohanpandula/digital-fauxice
GitHub: rohanpandula/digital-fauxice
该项目从零逆向重建了 Nikon LS-5000 胶片扫描仪 Digital ICE Normal 算法,在 CPU 和 CUDA 后端上实现了与原始输出逐字节一致的灰尘与划痕修复。
Stars: 28 | Forks: 6
# Digital Fauxice
作者:Rohan Pandula
[](https://github.com/rohanpandula/digital-fauxice/actions/workflows/tests.yml)
Digital Fauxice 是对 Nikon LS-5000 selector-8 Digital ICE Normal 处理路径的独立、从零开始的重新实现。它在两个不同的 3,946 x 5,782 物理帧上精确重现了 Nikon 逻辑上的 16 位 RGB 输出:每帧 68,447,316 个采样点零不匹配。第二帧使用了冻结的实现和配置文件,未进行重新调优。
本代码库包含可移植的处理核心、合成测试和经过处理的验证凭证。它不包含 Nikon 软件、固件、扫描仪二进制文件、个人扫描件或色彩反转相关的成果。
## Digital ICE 的作用
兼容的胶片扫描仪会记录四个通道:红、绿、蓝和红外。普通彩色负片中的染料会透射大部分红外光。而灰尘和划痕则不会,因此红外通道为软件提供了关于表面损伤的第二个视角,该视角在一定程度上独立于照片本身。
困难之处在于判断什么是真正的缺陷,然后在不破坏胶片颗粒感或将边缘错误复制到其他位置的情况下对其进行修复。Nikon 的实现远不止于对红外平面进行阈值处理并调用图像修复工具。它使用了低分辨率预扫描、内容衍生校准、多种局部重建尺度、确定性条件抖动,以及具有不寻常边缘特性的区块调度器。
Digital Fauxice 在运行时无需加载 Nikon 代码即可重现该处理过程。Nikon 的结果仅在验证过程中作为只读的比较基准出现。
## 结果
| 检测项 | 帧 1 | 独立帧 2 |
|---|---:|---:|
| 图像尺寸 | 5,782 x 3,946 x 3 | 5,782 x 3,946 x 3 |
| 对比的 RGB16 采样点数 | 68,447,316 | 68,447,316 |
| 不匹配的采样点数 | 0 | 0 |
| 不匹配的像素数 | 0 | 0 |
| 最大绝对差值 | 0 | 0 |
| 变更像素掩码一致性 | 6,426,156 / 6,426,156 | 6,718,151 / 6,718,151 |
| 检查的 RNG 推进次数 | 34,596,507 | 36,383,248 |
| 无界边缘回退次数 | 0 | 0 |
| 凭证检查 | 25 / 25 | 25 / 25 |
| 冻结代码未重新调优 | 基准 | 是 |
第二帧不是经过位移或重命名的副本。与帧 1 的高通相关性配准结果为 0.003436。在相同检测下,对帧 1 的已知重复扫描测量值为 0.617244。
当前的 Apple Silicon Python 和 NumPy 参考实现在第一个全帧检测上耗时 71 分 54 秒,在第二个上耗时 48 分 54 秒。这些时间描述的是一个刻意保持保守的研究实现,而非最终完善的 CPU 后端。
公开凭证位于 [`evidence/`](evidence/)。它们绑定的是原始的冻结闭包源清单,而不是后来位于 `src/portable_digital_ice/` 下重命名了命名空间的运行时。在将它们用作验证凭证之前,请参阅 [`DERIVATION.md`](DERIVATION.md)。验证方法和声明边界记录在 [`docs/validation.md`](docs/validation.md) 中。
## 需要还原的内容
最终实现包括:
- 285 dpi 预扫描与 4000 dpi 主 RGBI 扫描之间的关系;
- 16 位对数输入响应和四通道工作表示;
- 红外辅助信号和内容衍生帧校准;
- 评分、决策历史记录和分辨率相关的半径;
- 多尺度局部重建候选及其精确累积顺序;
- Nikon 的 24 位线性同余随机数生成器和条件抖动调度;
- 输出响应表、整数转换和小端序 RGB16 分散;以及
- 流式调度器、接缝、启动状态和部分末尾区块。
一像素的改变可能会在数百万次调用后扰乱 RNG 链。错误的邻域半径可能在数百行中看起来都合理。原生帧中的最后一个区块只有六个有效行。这些细节就是为什么视觉相似性从未被用作检测标准的原因。
## 工作是如何完成的
本研究使用哈希固定的二进制文件作为凭证,但这些文件被保密。静态分析确立了大致的结构、常量、对象状态和调用边界。随后,窄范围的运行时记录器在不改变流经特定函数数据的情况下,捕获了这些函数的输入和输出。其余工作则由受控扰动完成。各个通道、行、像素和状态字段被逐一更改,以确定哪些输出行为会随之变化。候选规则被独立实现,并与留出的输出进行比较。所有有歧义的情况都保持开放,直到有测试能够区分相互矛盾的解释。
完整帧检测还会在执行前后检查源哈希、输入不变性、文件角色分离、输出持久性、RNG 运算、变更像素掩码和底部边缘处理。独立的验证器不导入该可移植包或检测运行器。
[`docs/reverse-engineering.md`](docs/reverse-engineering.md) 包含更详细的说明,包括半径 4 失败、启动状态校正和独立帧晋级检测。
## 支持的边界
逆向工程的证据涵盖:
- Nikon Super Coolscan 5000 ED;
- Nikon 内部的 selector-8 X3A 路径;
- Digital ICE Normal;
- 观察到的内部分辨率指标 500 和 4000;
- 在两个不同的已挂载 C-41 帧上进行完整的原生 4000 dpi 处理;以及
- 使用 Python 和 NumPy 的精确 CPU 执行;以及
- 在 NVIDIA RTX A4000 上精确的 CUDA 执行。
打包的运行时目前仅启用两个完整原生帧检测所使用的 metric-4000 配置文件。在该配置文件之外,它会失败关闭。它不支持其他扫描仪、其他 Digital ICE 模式、未观察到的分辨率指标,或所有可能的胶片和缺陷分布。传统的银盐黑白胶片和某些 Kodachrome 材料可能不适合红外修复,因为图像本身会阻挡红外光。
此代码修复来自红外缺陷信号的 RGB 像素。它不反转负片,不重现 Nikon 的色彩渲染,也不包含任何独立的色彩研究。
## 安装和测试
参考包需要 Python 3.11 或更高版本以及 NumPy。
```
git clone https://github.com/rohanpandula/digital-fauxice.git
cd digital-fauxice
python -m pip install -e '.[dev]'
pytest
```
运行时接受两个表示同一物理帧的不可变 16 位 RGBI 数组:285 dpi 预扫描和 4000 dpi 主捕获。在采集过程中,焦点、曝光、帧位置和裁剪几何形状必须保持固定。
不支持的扫描仪、模式、深度、几何形状或配置文件组合会在写入输出之前引发错误。
扫描仪采集适配器和最终用户的 TIFF 工作流仍是产品开发阶段。有关库边界,请参阅 [`docs/input-contract.md`](docs/input-contract.md)。
Python 发行版名称仍为 `portable-digital-ice`,导入路径仍为 `portable_digital_ice`,因此新的项目名称不会破坏 v0.1 的集成。
## 性能与后端
签入的 CPU 路径是精确的参考实现。可选的确定性 CUDA 后端通过 `ComputeBackend.AUTO | CPU | CUDA` 提供,并已通过在两个完整的原生 4000 dpi 帧上绑定的凭证进行了验证:与此包的 CPU 参考实现相比,RGB16 输出相同(逐个采样点进行比较,每帧 68,447,316 个值,零不匹配),变更像素统计、RNG 推进计数、最终 RNG 状态、启动凭证以及完整的合成对抗套件均保持一致。两份凭证都绑定了此代码树中相同的最新源清单。在 NVIDIA RTX A4000 上,完整处理一帧大约需要 21 秒,而参考实现大约需要一个小时,且重复运行的输出具有确定性。当不可用时,`cuda` 会因特定原因失败并关闭;`auto` 仅在启动自检通过字节奇偶校验后选择 CUDA。请参阅 [`docs/cuda-backend.md`](docs/cuda-backend.md) 和 [`evidence/`](evidence/) 下的凭证。
适用于 Apple Silicon 的 Metal 后端仍在计划中,遵循相同规则:可用性和速度并不能作为一致性的证据,在任何后端的完整输出与参考实现达到逐字节匹配之前,都不会将其标记为精确。
NegPy 集成正在单独开发中,因此本代码库仍将是一个小型、专注于扫描仪的引擎,而不是一个应用程序分支。
## 混合修复计划
精确引擎将保持不变且可用。在我目前的测试中,其红外引导的修复已经超越了纯 RGB 的通用图像修复。我还计划为难以用精确局部方法重建的缺陷引入一种可选的混合模式。它将使用红外数据来定位损伤,在置信度高的区域保留精确修复,并仅在低置信度区域内允许有界的内容感知回退。
混合输出将保留原始输入和每像素的溯源掩码。它将拥有自己的验证标签,且绝不会被描述为逐字节精确的 Nikon 输出。提议的检测和实现顺序在[`混合修复路线图`](docs/hybrid-repair-agent-prompt.md)中。
## 代码库结构
| 路径 | 内容 |
|---|---|
| `src/portable_digital_ice/` | 独立运行时和失败关闭的 LS-5000 配置文件 |
| `tests/` | 可再发行的合成与契约测试 |
| `evidence/` | 经过脱敏处理的完整帧凭证 |
| `docs/reverse-engineering.md` | 研究方法及恢复过程中的难点 |
| `docs/validation.md` | 精确检测、凭证语义及限制 |
| `docs/input-contract.md` | 双 RGBI 采集和 API 要求 |
| `docs/hybrid-repair-agent-prompt.md` | 可选混合模式的路线图和验证规则 |
## 许可证和名称
本代码库中的原始代码在 MIT 许可证下提供。请参阅 [`LICENSE`](LICENSE)。
Nikon、Nikon Scan、COOLSCAN 和 Digital ICE 归其各自所有者所有。这是一个独立的互操作性项目。它不隶属于 Nikon 或 Digital ICE 的所有者,也不受其认可或支持。
标签:CUDA, Vectored Exception Handling, 云资产清单, 图像修复, 图像处理, 硬件驱动, 胶片扫描, 逆向工具, 逆向工程