图像焦点计算

时间:2010-01-25 19:20:50

标签: c# image-processing automated-tests computer-vision aforge

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

不幸的是,我似乎无法从头开始找到有关构建自动对焦算法的信息,所以我给了它最好的尝试:

拍摄照片。应用sobel边缘检测滤波器,生成灰度边缘轮廓。生成直方图并保存标准开发。将相机移近主体一步并拍摄另一张照片。如果标准开发小于前一个,我们将获得更多关注。否则,我们已经超过拍摄照片的最佳距离。

有更好的方法吗?

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

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

更新3:yay final update。再次回到这里。最终的代码如下所示:

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

第2步:找到我正在聚焦的物体的边缘(在我的情况下,它是一个总是在同一个地方的矩形物体,所以我裁剪出一个边缘的HIGH和NARROW矩形)

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

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

步骤5:找到直方图值的导数

步骤6:当您的坡度最大时,就是您处于最关注点时。

7 个答案:

答案 0 :(得分:7)

您可以查看NASA好奇号火星探测器中使用的技术。

本文介绍了该技术

EDGETT, Kenneth S., et al. Curiosity’s Mars Hand Lens Imager (MAHLI) Investigation. Space science reviews, 2012, 170.1-4: 259-317.

PDF here的形式提供。

引用文章:

  

7.2.2自动对焦

     

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

     

可以通过自动对焦执行   整个MAHLI视野,或者它可以在子帧上执行   对应于场景中包含对象的部分   被研究。取决于主题的性质和知识   用户可能会对MAHLI机器人手臂定位的不确定性有所了解   选择获取居中的自动对焦子框架,或者他们可以选择   如果定位知识是偏心自动对焦子帧   足以确定子框架的位置。用于   强烈建议使用子帧来执行自动对焦,因为这样做   通常导致受试者比案例更好地关注   当自动对焦应用于全CCD时;由此产生的   通常使用子帧自动聚焦的电机计数位置   从像素尺度更准确地确定工作距离。

以下是图23:

Autofocus in NASA Curiosity Mars Rover

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

这可能很有用。这是相机的AF系统实际工作的方式 - Passive Autofocus

  

对比度测量

     

通过以下方式实现对比度测量   测量传感器内的对比度   场,通过镜头。强度   相邻像素之间的差异   传感器自然随之增加   正确的图像焦点。光学   从而可以调整系统直到   检测到最大对比度。在   这种方法,AF不涉及   实际距离测量和   通常比相慢   检测系统,特别是当   在昏暗的灯光下操作。就像它一样   但是,不要使用单独的传感器   对比度检测自动对焦可以更多   灵活的(因为它实施于   软件)可能更多   准确。这是一种常见的方法   摄像机和消费级   没有百叶窗的数码相机   反光镜。一些数码单反相机(包括   奥林巴斯E-420,松下L10,尼康   D90,尼康D5000,三脚架中的尼康D300   模式,佳能EOS 5D Mark II,佳能EOS   50D)聚焦时使用此方法   他们的实时视图模式。一个新的   可更换镜头系统,Micro   四分之三,专门使用对比度   测量自动对焦,据说   提供与阶段相当的性能   检测系统。

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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