18

我正在尝试为一些测试自动化工作开发图像聚焦算法。我选择使用 AForge.net,因为它看起来是一个成熟的、对 .net 友好的系统。

不幸的是,我似乎无法找到有关从头开始构建自动对焦算法的信息,因此我已尽我所能:

拍照。应用 sobel 边缘检测滤波器,生成灰度边缘轮廓。生成直方图并保存标准开发。将相机移近拍摄对象并拍摄另一张照片。如果标准开发比以前的开发更小,我们就会更加关注。否则,我们已经超过了拍照的最佳距离。

有没有更好的办法?

更新:顺便说一句,这方面存在巨大缺陷。当我越过最佳焦点时,我的“焦点图像”价值会继续增长。你会期望一个看距离/焦点值的抛物线函数,但实际上你得到的东西更对数

更新 2:好的,所以我回到了这个,我们正在探索的当前方法给出了一些已知的边缘(好的,所以我确切地知道图片中的对象是什么),我进行了手动像素强度比较。随着结果图变得越来越陡峭,我的注意力也越来越集中。一旦核心算法从 matlab 移植到 c# 中,我将发布代码(是的,matlab .. :S)

更新 3:是的,最终更新。又回到了这个。最终代码如下所示:

第1步:从图像列表中获取图像(我通过焦点拍了一百张照片)

第 2 步:为我正在聚焦的对象找到一个边缘(在我的情况下,它是一个始终在同一个位置的矩形对象,所以我裁剪了一个边缘的 HIGH 和 NARROW 矩形)

第 3 步:获取该裁剪图像的 Horizo​​ntalIntensityStatistics(Aforge.net 类)。

第 4 步:获取直方图(在我的情况下为灰色)

第 5 步:求直方图值的导数

第6步:当你的斜率最大时,就是你在最集中的时候。

4

7 回答 7

10

您可以查看美国宇航局好奇号火星探测器中使用的技术。

本文描述了该技术

EDGETT,肯尼斯 S.,等人。好奇号的火星手持镜头成像仪 (MAHLI) 调查。空间科学评论,2012,170.1-4:259-317。

可在此处以 PDF 格式获取。

引用文章:

7.2.2 自动对焦

自动对焦预计将成为 MAHLI 专注于火星的主要方法。自动对焦命令指示相机移动到指定的起始电机计数位置并收集图像,移动指定的步数并收集另一个图像,并继续这样做直到达到指定的图像总数,每个图像由指定的电机分隔计数增量。这些图像中的每一个都是 JPEG 压缩的(联合图像专家组;参见 CCITT (1993)),并应用了相同的压缩质量因子。每个压缩图像的文件大小是对场景细节的衡量,而这又是焦点的函数(对焦图像比同一场景的模糊、失焦视图显示更多细节)。如图 23 所示,相机确定 JPEG 文件大小和电机数量之间的关系,并将抛物线拟合到三个相邻的最大文件大小。抛物线的顶点提供了对最佳对焦电机计数位置的估计。做出此决定后,MAHLI 将镜头焦点组移动到最佳电机位置并获取图像;此图像被存储,用于确定自动对焦位置的较早图像不会被保存。

自动对焦可以在整个 MAHLI 视场上执行,也可以在对应于包括要研究的对象的场景部分的子帧上执行。根据主题的性质和对 MAHLI 机械臂定位不确定性的了解,用户可能会选择获取居中的自动对焦子帧,或者如果定位知识足以确定位置,他们可能会选择偏离中心的自动对焦子帧应定位子框架。强烈建议使用子帧来执行自动对焦,因为这通常会导致拍摄对象的对焦比将自动对焦应用于全 CCD 的情况更好;更远,

下面是图23:

美国宇航局好奇号火星探测器的自动对焦

在这个答案中也提出了这个想法:https ://stackoverflow.com/a/2173259/15485

于 2015-10-05T14:30:52.170 回答
5

对于您的需求,这可能有点简单,但我通过一个简单的算法获得了很好的结果,该算法查看了与相邻像素的差异。两距离像素差的总和似乎是图像对比度的合理度量。我在 70 年代找不到 Brenner 的原始论文,但在http://www2.die.upm.es/im/papers/Autofocus.pdf中提到了它

另一个问题是当图像极度失焦时,焦点信息很少,因此很难判断哪种方式是“靠近”或避免局部最大值。

于 2010-01-31T22:17:24.813 回答
3

这可能很有用。这就是相机的自动对焦系统的实际工作方式——被动自动对焦

对比度测量

对比度测量是通过镜头测量传感器区域内的对比度来实现的。传感器的相邻像素之间的强度差异自然会随着正确的图像聚焦而增加。从而可以调整光学系统直到检测到最大对比度。在这种方法中,AF 根本不涉及实际距离测量,并且通常比相位检测系统慢,尤其是在昏暗光线下操作时。但是,由于它不使用单独的传感器,因此对比度检测自动对焦可以更灵活(因为它是在软件中实现的)并且可能更准确。这是缺少快门和反光镜的摄像机和消费级数码相机中的常用方法。一些数码单反相机(包括奥林巴斯 E-420、松下 L10、尼康 D90、尼康 D5000、三脚架模式下的尼康 D300、佳能 EOS 5D Mark II、佳能 EOS 50D)在实时取景模式下对焦时使用此方法。一种新的可互换镜头系统,微型四分之三,专门使用对比度测量自动对焦,据说其性能可与相位检测系统相媲美。

于 2010-01-27T17:03:58.263 回答
3

我自己还没有建立一个,但我的第一个想法是对图像的一部分进行 2D DFT。失焦时,高频会自动消失。

对于惰性原型,您可以尝试使用 JPEG(高质量)压缩图像的一个区域,并查看输出流大小。大文件意味着很多细节,这反过来意味着图像是焦点。请注意,相机不应过于嘈杂,并且您当然无法比较不同场景的文件大小。

于 2010-01-31T20:45:51.600 回答
1

虽然 sobel 是一个不错的选择,但我可能会选择对几个小的代表性区域上的 x 和 y 方向的投影进行边缘幅度计算。另一个基于 OpenCV 的 .NET 友好选择是 @http: //www.emgu.com/wiki/index.php/Main_Page

于 2010-01-31T21:18:35.277 回答
0

我想知道标准差是否是最佳选择:如果图像变得更清晰,sobel 过滤器图像将在边缘包含更亮的像素,但同时明亮的像素会更少,因为边缘越来越薄。也许您可以尝试使用 sobel 图像中 1% 最高像素值的平均值?

于 2010-01-27T08:39:14.727 回答
0

焦点指标的另一种风格可能是:

抓取几张图像并对它们进行平均(降噪)。然后对平均图像进行 FFT 并使用高低频能量比。这个比率越高,焦点就越好。工具箱的演示中提供了 Matlab 演示(不包括平均阶段):)

于 2011-09-01T05:39:40.423 回答