AutoSplitter 的演进
发布日期: 2026年10月27日
2012 年——检测角点
开始开发 AutoSplitter 时,我没有真正的参考对象。我唯一试用过的是平板扫描仪制造商提供的基础扫描软件,而它确实差强人意。
我想做出更好的软件,而唯一的测试设备就是我自己的扫描仪和家人的照片。这些照片没有粘在发黄的相册里,只是堆放在一个纸板箱中。
因此我认为,对几乎所有人来说,把照片放在平板扫描仪发白的背景上进行扫描,就是唯一的使用场景。
这启发了我的照片检测算法的第一个版本。任务看起来很明确:给定一张包含多张照片的扫描图像,判断哪些像素属于照片、哪些属于扫描仪平台,从而找出照片。所有照片都是矩形的,而且(大多)有清晰的角。照片角点周围的相邻像素中,25% 属于照片,75% 属于背景。背景通常接近白色,而照片内容一般与白色相去甚远。
按照这种逻辑评估像素组,大多数时候都能找到角点。某些检测是误报(实际上并不是角点),另一些则是漏报(未检测到的角点)。根据角点像素周围哪些区域看起来像背景、哪些像是照片的一部分,可以轻松将检测到的角点分类为左上、右上、左下或右下角。
确定一张照片的位置,两三个角点就可能相当准确。这种方法在我的照片集合上效果不错。漏掉一些角点会带来问题,例如多张照片被错误地合并,但它仍然比扫描仪自带的原厂软件好得多。
顺便一提,边缘检测也是在图像中查找矩形形状的好方法。我不能说它从未在我的算法中发挥作用,但它只用于辅助评估照片检测结果,从来不是主要方法。
2019 年——正方形和区块……还有角点

2019 年秋天,在反复尝试改进自动检测算法多年后,我仍然没有取得太大进展。通过微调角点检测方法,我取得了一些成效,但从未有过革命性的改进。我为角点检测算法增加了多个过滤层,使它即使在用户不以白色为扫描背景时也能工作。这相当有帮助,但还不够。
下一个重大进展是“正方形方法”。在 IT 领域,这称为连通分量标记和凸包拟合。这个想法相当简单:使用不同的滤镜将输入图像中的所有像素标记为背景或照片,然后找出看起来都属于照片的像素组。将相邻的正方形合并成组;每组大致勾勒出一张检测到的照片。
这种方法在背景不均匀时也效果不错。我大幅提高了角点检测算法的严格程度,使其只检测明显的照片。然后由正方形方法处理剩余的未检测区域,寻找其他照片。遗憾的是,我没能找到准确检测照片旋转角度的方法,所以照片始终以未旋转状态(0 度)被检测到。即便如此,与仅依靠角点的方法相比,这仍是一大进步。
2026 年夏天——正方形终于会旋转了
在多次尝试进一步改进自动检测方法都失败后,我终于成功确定了检测到的正方形组的旋转角度。这促使我放弃正方形检测,因为它是许多误报和检测结果合并的根本原因。然而,我又一次没能进一步改善结果。
2026 年初秋——深度学习
已经没有别的路可走了。正方形和角点无法带来更好的结果。无论我如何微调算法,一个无法回避的事实始终存在:在图像中找出矩形物体很容易。判断哪些像素属于照片却很难——非常难。一切都取决于对每个像素进行这种简单的二元分类。如果无法准确判断哪些像素属于矩形,那么无论矩形检测方法调得多好也没有意义,对吧?
深度学习使用神经网络——这类算法在一定程度上模仿人脑。训练神经网络需要大量样本数据(以及对应的答案),用来训练和评估网络。针对扫描图像训练照片检测系统并不容易。你不可能在互联网上找到一整卡车的扫描照片。我也无法从客户那里获得这些照片,因为软件绝不会上传任何扫描图像,客户当然也不会同意这种处理方式。
深度学习为这个至关重要的问题提供了答案:这个像素属于照片吗?如果能可靠地回答这个问题,一个简单的连通分量标记算法(我喜欢称它为“正方形”)就能非常可靠地检测照片。
我找到了一种获取足够样本数据来训练神经网络的方法,同时不会损害任何人的隐私。因此,从 v1.16.1 起,AutoSplitter 就能够非常可靠地检测照片。
未来
目前我还不知道接下来会怎样。为了进一步改善自动检测,训练数据可能还需要完善。结果显然还没有达到 100% 的准确率,而且可能永远也达不到。无论如何,如果我看到改进的办法,就会尝试。