Back to home@PetCT

dsh-Bio-image-dup-check

科研图片查重 DSH 插件 · 本地离线检测整图重复/翻转/旋转/缩放、copy-move、跨图区域复用与 PDF 稿件图片。A local-offline integrity checker for life-science figures (DeepSeek Harness plugin).

Stars
1
Language
JavaScript
Created
Aug 25, 2026
Updated
Aug 25, 2026

Introduction

科研图片查重 · dsh-Bio-image-dup-check

CI License: MIT Node PRs Welcome

一个运行在 DeepSeek Harness (DSH) 里的生命科学科研图片查重插件:检测图片之间的整图重复 / 翻转 / 旋转 / 缩放重压缩单图内部的局部复制粘贴(copy-move)跨图局部区域复用(自动框出并给出裁剪对比),并支持对 PDF 稿件直接抽取图片查重(带页码标注)。输出美观的可视化报告,全程本地离线,不上传任何图片数据。

English — A local, offline image-integrity checker for life-science figures (Western blots, microscopy, gels, FACS…), built as a DeepSeek Harness plugin. It detects whole-image duplicates / flips / rotations / resizing, intra-image copy-move forgery, cross-image region reuse (with auto-cropped side-by-side evidence) and duplicates inside PDF manuscripts — entirely on your machine. Documentation is primarily in Chinese; issues and PRs in any language are welcome.


功能特性 · Features

  • 整图相似度:aHash + dHash(含 6 种几何变换)+ pHash 三路感知哈希,自动标出「重复 / 水平翻转 / 垂直翻转 / 旋转 90°·180°·270° / 缩放重压缩」。
  • 局部重复(copy-move):16×16 分块 + 8×8 灰度向量 RMS 匹配 + 偏移聚类,在单张图上框出被复制粘贴的区域(红=源,蓝=复制)。
  • 跨图局部复用:分块偏移聚类 + 区域 RMS + 结构哈希复核,自动生成“图A 复用区域 ↔ 图B 对应区域”的并排裁剪图(可点击放大),覆盖同尺度与放大裁剪(0.2x–1x 缩放检测)。
  • PDF 稿件查重:对象级解析(XObject / ObjStm / 间接色彩空间 / SMask 排除),JPEG / Flate(含 PNG-TIFF 预测器)/ ASCII85 / RunLength / JPEG2000 / Indexed / ICCBased / CMYK / 灰度;按页面内容流精确标注页码;默认忽略“未被页面绘制的冗余对象”避免幽灵副本膨胀;可只报跨页重复
  • 目录递归 + 子文件夹汇总:扫描一个大文件夹下的所有子文件夹,按子文件夹汇总(图片数 / 组内重复 / 跨文件夹重复),支持文件夹筛选。
  • 一个「刷新」搞定调参:拖拽图片、目录、PDF 三种入口都会记住已载入的数据,更改阈值/开关后点「刷新」即重新检测,无需重新上传。
  • 美观报告:摘要徽章、子文件夹汇总、重复分组(传递闭包聚类)、相似度热力矩阵、疑似对并排缩略图、局部复用裁剪对比。
  • 导出:HTML(自包含,可离线打开/分享)、Markdown、JSON。
  • 双入口:图形界面(DSH 设置页)+ Agent 工具 check_image_duplicates(folder)
  • 深色模式适配、完全本地离线、可持续集成(GitHub Actions)。

支持格式 · Supported formats

类别格式解码器
基础PNG、JPEG、BMP、GIF、TIFFjimp(纯 JS)
扩展WebP、AVIF、HEIC/HEIF、JPEG2000(.jp2/.j2k)、SVGsharp(预编译 libvips),jimp 失败时自动后备
PDF 内嵌JPEG、Flate(含 PNG/TIFF 预测器)、ASCII85/Hex、RunLength、JPEG2000、Indexed/ICCBased/CMYK/灰度自研对象级解析器 + 上述解码器
不支持PDF 中的 CCITT Fax 黑白压缩图、纯矢量图形(非位图)

未安装 sharp 时仅影响扩展格式(提示“格式不支持”),其余功能不受影响;npm install 会一并下载 sharp 的预编译二进制,无需本地编译。

快速开始 · Quick start(动态插件形态)

git clone https://github.com/PetCT/dsh-Bio-image-dup-check.git && cd dsh-Bio-image-dup-check
npm install                                   # 安装 jimp + sharp(平台预编译二进制,无需本地编译)
node hash-worker.mjs --selftest               # 自检算法(翻转/旋转/局部复制判定)
node make-demo.mjs && node hash-worker.mjs --dir demo --threshold 8   # 端到端冒烟

然后在任意 DSH 会话里:

  1. 打开本目录的 host.js,把文件内容整体粘贴到 cordis_definecode.host
  2. 打开 client.js,把文件内容整体粘贴到 code.client
  3. cordis_run 激活(Client 半部分需在 Run 卡片勾选授权)。

⚠️ 唯一需要配置的地方host.js 顶部有一处 WORKER_PATH 常量,请改成你本机 hash-worker.mjs 所在的绝对路径(动态插件沙箱无法探测/引用文件,这是设计如此;路径写错时会给出明确报错提示)。

使用 · Usage

图形界面

DSH 设置 → 「科研图片查重」,三种入口:

  • 拖拽/选择图片:多选图片文件(支持上表全部格式),调阈值后点「刷新」重跑;
  • 扫描目录:点「选择文件夹」或输入路径,勾选「包含子文件夹(汇总)」递归扫描;结果顶部按子文件夹汇总并支持筛选;
  • PDF 检测:选择 PDF,勾选「忽略未绘制对象(推荐)」「仅报跨页重复」,改设置后点「刷新」即可不用再上传。

查看报告:摘要、子文件夹汇总、重复分组、疑似重复/变换对(可按类型/文件夹筛选排序)、疑似局部复用(裁剪对比图)、相似度矩阵、局部重复区域高亮;点「导出 HTML / Markdown / JSON」保存报告。

Agent 工具

直接对 DSH 说:「帮我查 G:\papers\figures 目录下的图片重复」,或调用:

check_image_duplicates(folder="G:\papers\figures", threshold=8, recursive=true)

检测算法 · Algorithm

  • 感知哈希:灰度(Rec.601)→ 区域平均下采样 → aHash(8×8) / dHash-H(9×8) / dHash-V(8×9) / pHash(32×32 DCT);两两汉明距离 + 6 种几何变换比对 → 判定变换类型。
  • copy-move:长边 ≤384px 灰度 → 16×16 块(步长 16)→ 8×8 灰度向量 RMS + 均值差匹配(剔除平坦块)→ 按位移向量聚类 → 输出归一化区域矩形对。
  • 跨图复用:24×24 密度网格 + 块 RMS(≤9) + 均值(±16) 过滤 → 位移聚类 → 区域级 RMS(≤9) + dHash(≤40) 结构校验 → 输出归一化区域对与缩放比。
  • PDF 解析N 0 obj 分段 + 递归字典解析(含对象流 ObjStm、间接颜色空间、SMask 排除)→ 按页面内容流 Do 操作符精确映射页码(支持 Image-xxx 等带连字符名称、Form 递归)。

详细设计见 SPEC.md,算法口径见 CHANGELOG.md

项目结构 · Structure

.
├── host.js             # Host 半部分(动态插件)
├── client.js           # Client 半部分(动态插件)
├── hash-worker.mjs     # 哈希引擎(Node + jimp + sharp + PDF 解析)
├── make-demo.mjs       # 生成演示图
├── package.json        # jimp / sharp / pdf-lib 依赖 + 元数据
├── cordis.patch.yml    # 持久化安装用的 bundle patch(可选)
├── SPEC.md             # 设计规范(v1.1 基线 + 实现状态补充)
├── CONTRIBUTING.md     # 贡献指南
├── CODE_OF_CONDUCT.md  # 行为准则
├── CHANGELOG.md        # 更新日志
├── README.md
├── LICENSE             # MIT
└── .github/
    ├── workflows/ci.yml             # CI:语法 + 自检 + 目录/PDF 冒烟
    ├── ISSUE_TEMPLATE/              # Bug / 功能请求模板
    └── PULL_REQUEST_TEMPLATE.md

关于作者与社区共建 · About & Community

作者是一名生命科学博士,这个工具最早就是为了自己投稿前查自己稿件的图片问题而写的。它围绕真实论文图片(组织切片、Western blot、凝胶电泳、流式图、PDF 稿件)打磨,算法与流程经过多轮真实稿件验证。

诚实地讲:作者不是专业开发者(代码可能不符合“工程最佳实践”),但产品目标是实打实解决科研图片查重的痛点。因此:

  • 发现误报 / 漏报?遇到解析不了的文件?有想加的功能? → 请开 Issue你手里的一张真实图片或一个 PDF,就是这个项目最好的测试用例。(数据保密:请只上传/提供你有权使用的样本;检测全程本地离线,项目绝不收集任何图片。)
  • 想动手改进? → 任何层级的贡献都欢迎:修 bug、补文档、加测试、优化界面、改算法。见 CONTRIBUTING.md
  • 这个项目的迭代方式:作者定方向并维护主流程,社区可以在上面直接打磨——比如把某个检测算法调得更准、支持你实验室的专属格式、让报告更漂亮。欢迎 fork 回来,我们一起把它做成一个投稿前真正愿意用的查重工具。

Roadmap(欢迎认领)

  • 算法:自适应阈值 / 同源显微视野降噪(现已有「仅报跨页重复」开关做缓解);Western blot 条带、凝胶泳道专项比对。
  • 格式:CCITT 传真 PDF 图;原始显微格式(OME-TIFF / CZI)。
  • 报告:批处理导出、跨文件 CSV 汇总、对比裁图自动排版。
  • 分发:npm 包 / 持久化 DSH bundle 的完善安装体验。

限制与免责声明 · Limitations

  • 检测基于启发式算法(感知哈希 + 分块匹配),结果需人工复核,不构成学术结论
  • 单文件 > 25MB 跳过;目录模式默认限制 1000 张(可调 limit);拖拽模式单批 ≤60 张;PDF 单文件 ≤100MB、检测限时 240s。
  • 规则性重复纹理(如细胞培养板孔、凝胶泳道)可能触发误报——这通常是值得人工确认的信号。
  • 同源显微照片(同一组织的不同视野/倍率)缩略后可能被判为“近重复”,可提高阈值或开启「仅报跨页重复」降低噪声。
  • PDF 中的纯矢量图形不会被当作图片(无内嵌位图);CCITT 传真压缩图(老旧扫描件)暂不支持。

License

MIT — 见 LICENSE。收录 ≠ 背书;请只对你有权使用的图片运行检测。

© 2026 PetCT