Ore*_*zor 18 c# automated-tests image-processing computer-vision aforge
我正在尝试为一些测试自动化工作开发图像聚焦算法.我选择使用AForge.net,因为它看起来像一个很好的成熟.net友好系统.
不幸的是,我似乎无法从头开始找到有关构建自动对焦算法的信息,所以我给了它最好的尝试:
拍照.应用sobel边缘检测滤波器,生成灰度边缘轮廓.生成直方图并保存标准开发.将相机移近主体一步并拍摄另一张照片.如果标准开发小于前一个,我们将获得更多关注.否则,我们已经超过拍摄照片的最佳距离.
有没有更好的办法?
更新:顺便说一下,这有很大的缺陷.当我超越最佳焦点时,我的"焦点图像"价值继续增长.你期望一个抛物线函数看距离/焦点值,但实际上你会得到一些更对数的东西
更新2:好的,所以我回到了这个,我们正在探索的当前方法给出了一些已知的边缘(好吧,所以我确切地知道图片中的对象是什么),我做了一个手动像素强度比较.随着结果图变得越来越陡峭,我得到了更多关注.一旦核心算法从matlab移植到c#(是的,matlab ..:S),我就会发布代码
更新3:yay最终更新.再次回到这里.最终的代码如下所示:
第1步:从图像列表中获取图像(我通过聚焦点拍摄了一百张照片)
第2步:找到我正在聚焦的物体的边缘(在我的情况下,它是一个总是在同一个地方的矩形物体,所以我裁剪出一个边缘的HIGH和NARROW矩形)
第3步:获取该裁剪图像的HorizontalIntensityStatistics(Aforge.net类).
第4步:获取直方图(灰色,在我的情况下)
步骤5:找到直方图值的导数
第6步:当你的坡度最大时,就是你处于最关注点的时候.
您可以查看NASA Curiosity Mars Rover中使用的技术.
本文介绍了该技术
EDGETT,Kenneth S.,et al.好奇心的火星手镜成像仪(MAHLI)调查.空间科学评论,2012,170.1-4:259-317.
引用文章:
7.2.2自动对焦
预计自动对焦是MAHLI专注于火星的主要方法.自动对焦命令指示摄像机移动到指定的起始电机计数位置并收集图像,移动指定的步数并收集另一个图像,并继续这样做,直到达到指定的图像总数,每个图像由指定的电机分开计数增量.这些图像中的每一个都是JPEG压缩的(联合图像专家组;参见CCITT(1993)),其中应用了相同的压缩质量因子.每个压缩图像的文件大小是场景细节的度量,其又是焦点的函数(对焦图像显示比同一场景的模糊,离焦视图更多的细节).如图23所示,相机确定JPEG文件大小和电机计数之间的关系,并将抛物线拟合到三个相邻的最大文件大小.抛物线的顶点提供了最佳聚焦马达计数位置的估计.做出此决定后,MAHLI将镜头焦点组移动到最佳电机位置并获取图像; 存储此图像时,不保存用于确定自动对焦位置的较早图像.
可以在整个MAHLI视场上执行自动聚焦,或者可以在与包括要研究的对象的场景部分相对应的子帧上执行自动聚焦.根据受试者的性质和MAHLI机器人手臂定位的不确定性的知识,用户可能选择获取居中的自动对焦子帧,或者如果定位知识足以确定位置,他们可能会选择偏心自动对焦子帧应该找到子框架.强烈建议使用子帧来执行自动对焦,因为这通常会导致拍摄对象比自动对焦应用于完整CCD的情况更好; 进一步,
以下是图23:
在这个答案中也提出了这个想法:https://stackoverflow.com/a/2173259/15485
对于您的需求可能有点简单,但我通过一个简单的算法得到了很好的结果,该算法着眼于与相邻像素的差异.2-away的像素差的总和似乎是图像对比度的合理度量.我在70年代找不到Brenner的原始论文,但在http://www2.die.upm.es/im/papers/Autofocus.pdf中提到了它.
另一个问题是当图像极度失焦时,焦点信息非常少,因此很难分辨哪种方式"靠近"或避免局部最大值.