我正在尝试为一些测试自动化工作开发图像聚焦算法。我选择使用 AForge.net,因为它看起来是一个成熟的、对 .net 友好的系统。
不幸的是,我似乎无法找到有关从头开始构建自动对焦算法的信息,因此我已尽我所能:
拍照。应用 sobel 边缘检测滤波器,生成灰度边缘轮廓。生成直方图并保存标准开发。将相机移近拍摄对象并拍摄另一张照片。如果标准开发比以前的开发更小,我们就会更加关注。否则,我们已经超过了拍照的最佳距离。
有没有更好的办法?
更新:顺便说一句,这方面存在巨大缺陷。当我越过最佳焦点时,我的“焦点图像”价值会继续增长。你会期望一个看距离/焦点值的抛物线函数,但实际上你得到的东西更对数
更新 2:好的,所以我回到了这个,我们正在探索的当前方法给出了一些已知的边缘(好的,所以我确切地知道图片中的对象是什么),我进行了手动像素强度比较。随着结果图变得越来越陡峭,我的注意力也越来越集中。一旦核心算法从 matlab 移植到 c# 中,我将发布代码(是的,matlab .. :S)
更新 3:是的,最终更新。又回到了这个。最终代码如下所示:
第1步:从图像列表中获取图像(我通过焦点拍了一百张照片)
第 2 步:为我正在聚焦的对象找到一个边缘(在我的情况下,它是一个始终在同一个位置的矩形对象,所以我裁剪了一个边缘的 HIGH 和 NARROW 矩形)
第 3 步:获取该裁剪图像的 HorizontalIntensityStatistics(Aforge.net 类)。
第 4 步:获取直方图(在我的情况下为灰色)
第 5 步:求直方图值的导数
第6步:当你的斜率最大时,就是你在最集中的时候。