我正在尝试为一些测试自动化工作开发图像对焦算法。我选择使用 AForge.net,因为它似乎是一个不错的成熟的 .net 友好系统。
不幸的是,我找不到有关从头开始构建自动对焦算法的信息,所以我尽力了:
获取图像。应用 Sobel 边缘检测滤镜,生成灰度边缘轮廓。生成直方图并保存标准差。将相机向主体移动一步,并拍摄另一张照片。如果标准偏差小于上一个,则表示我们正在变得更加聚焦。否则,我们已经超过了拍摄照片的最佳距离。
还有更好的方法吗?
更新:顺便说一下,这个方法存在严重漏洞。当我超过最佳焦点时,“图像聚焦”值仍然在增长。在距离/焦点值方面,您期望看到一个类似抛物线的函数,但实际上会得到更接近对数函数的东西。
更新2:好吧,我回到这个问题上来了,我们现在正在探索的方法是,给定几个已知的边缘(好吧,我确切地知道图片中的物体是什么),我进行手动像素强度比较。当结果图形变得更加陡峭时,我就会更加聚焦。一旦核心算法从 matlab 被移植到 c# 中,我将发布代码(是的,matlab..:S)。
更新3:最终更新,回到这个问题上来了。最终代码如下:
步骤1:从图像列表中获取图像(我通过聚焦点拍摄了一百张照片)
步骤2:找出我正在关注的对象的一个边缘(在我的情况下,它是一个始终在同一位置的矩形对象,因此我裁剪了一个高而窄的矩形边缘)
步骤3:为该裁剪图像获得 HorizontalIntensityStatistics(Aforge.net 类)
步骤4:获得直方图(在我的情况下是灰度图)
步骤5:找到直方图值的导数
步骤6:斜率最大时,即为最聚焦点。