我正在尝试为一些测试自动化工作开发图像聚焦算法。我选择使用AForge.net,因为它似乎是一个很好的成熟.net友好系统。
不幸的是,我似乎无法从头开始找到有关构建自动对焦算法的信息,所以我给了它最好的尝试:
拍摄照片。应用sobel边缘检测滤波器,生成灰度边缘轮廓。生成直方图并保存标准开发。将相机移近主体一步并拍摄另一张照片。如果标准开发小于前一个,我们将获得更多关注。否则,我们已经超过拍摄照片的最佳距离。
有更好的方法吗?
更新:顺便说一下,这有很大的缺陷。当我过去最佳焦点时,我的“焦点图像”值继续增长。你期望抛物线函数看距离/焦点值,但实际上你会得到更对数的东西
更新2:好的,所以我回到了这个,我们正在探索的当前方法有一些已知的边缘(好吧,所以我确切地知道图片中的对象是什么),我做一个手动像素强度比较。随着结果图变得越来越陡峭,我得到了更多关注。一旦核心算法从matlab移植到c#(是的,matlab ..:S),我就会发布代码。
更新3:yay final update。再次回到这里。最终的代码如下所示:
第1步:从图像列表中获取图像(我通过聚焦点拍摄了100张照片)
第2步:找到我正在聚焦的物体的边缘(在我的情况下,它是一个总是在同一个地方的矩形物体,所以我裁剪出一个边缘的HIGH和NARROW矩形)
第3步:获取该裁剪图像的HorizontalIntensityStatistics(Aforge.net类)。
第4步:获取直方图(灰色,在我的情况下)
步骤5:找到直方图值的导数
步骤6:当您的坡度最大时,就是您处于最关注点时。
答案 0 :(得分:7)
您可以查看NASA好奇号火星探测器中使用的技术。
本文介绍了该技术
以PDF here的形式提供。
引用文章:
7.2.2自动对焦
预计自动对焦是MAHLI的主要方法 专注于火星。自动对焦命令指示相机移动到 指定的起动电机计数位置并收集图像,移动a 指定的步数并收集另一个图像,并继续这样做 直到达到指定的图像总数,每个图像用a分隔 指定的电机计数增量。这些图像中的每一个都是JPEG 压缩(联合图像专家组;参见CCITT(1993)) 应用相同的压缩质量因子。每个文件的大小 压缩图像是一个场景细节的度量,它依次是一个 焦点功能(对焦图像显示的细节比模糊的更多, 离开焦点视图的同一场景)。如图23所示 相机确定JPEG文件大小和电机之间的关系 计算并将抛物线拟合到三个相邻的最大文件大小。 抛物线的顶点提供了最佳焦点的估计 电机计数位置。做出这个决定之后,MAHLI移动了 镜头焦点组到最佳电机位置并获取图像; 存储此图像,用于确定的早期图像 自动对焦位置未保存。
可以通过自动对焦执行 整个MAHLI视野,或者它可以在子帧上执行 对应于场景中包含对象的部分 被研究。取决于主题的性质和知识 用户可能会对MAHLI机器人手臂定位的不确定性有所了解 选择获取居中的自动对焦子框架,或者他们可以选择 如果定位知识是偏心自动对焦子帧 足以确定子框架的位置。用于 强烈建议使用子帧来执行自动对焦,因为这样做 通常导致受试者比案例更好地关注 当自动对焦应用于全CCD时;由此产生的 通常使用子帧自动聚焦的电机计数位置 从像素尺度更准确地确定工作距离。
以下是图23:
在这个答案中也提出了这个想法: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演示(不包括平均阶段):)