代码之家  ›  专栏  ›  技术社区  ›  Oren Mazor

图像焦点计算

  •  16
  • Oren Mazor  · 技术社区  · 15 年前

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

    不幸的是,我似乎从零开始找不到有关构建自动对焦算法的信息,所以我已经尽了最大努力:

    拍摄图像。应用Sobel边缘检测滤波器,生成灰度边缘轮廓。生成一个柱状图并保存标准设备。将相机移近一步,拍摄另一张照片。如果标准的dev比前一个小,那么我们将获得更多的关注。否则,我们已经超过了拍摄照片的最佳距离。

    有更好的方法吗?

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

    更新2:好的,我回到这里,我们现在研究的方法是给一些已知的边(好的,我知道图片中的对象是什么),我做了一个手动像素强度比较。当得到的图形变陡时,我会获得更多的焦点。一旦核心算法从matlab移植到c(是的,matlab..s)

    更新3:yay最终更新。又回到了这个问题上。最终代码如下:

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

    第二步:为我要聚焦的对象找到一个边(在我的例子中,它是一个总是在同一个位置的矩形对象,所以我裁剪一个高边和窄边的矩形)

    步骤3:获取该裁剪图像的HorizontalintensityStatistics(aforge.net类)。

    步骤4:获取柱状图(灰色,在我的例子中)

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

    第六步:当你的坡度最大时,就是你最集中的时候。

    7 回复  |  直到 9 年前
        1
  •  5
  •   Grhm    11 年前

    这可能有点简单,以满足您的需要,但我已经有了一个简单的算法,看看与相邻像素的差异良好的结果。两个方向的像素差之和似乎是一个合理的图像对比度测量方法。我在70年代找不到布伦纳的原稿,但在 http://www2.die.upm.es/im/papers/Autofocus.pdf

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

        2
  •  7
  •   Community CDub    7 年前

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

    本文介绍了这种技术

    edgett,Kenneth S.等人好奇号火星手透镜成像仪(Mahli)的研究。 空间科学评论 ,2012,170.1-4:259-317.

    其中a pdf here

    引自文章:

    < Buff行情>

    7.2.2自动对焦

    预计自动对焦是Mahli的主要方法。 专注于火星。autofocus命令指示相机移动到 指定的启动电机计数位置并采集图像,移动 指定步骤数并收集另一个图像,并继续执行此操作 直到达到命令的图像总数,每个图像由 指定的电机计数增量。这些图片都是jpeg 压缩(联合摄影专家组;见CCITT(1993))与 应用相同的压缩质量系数。每个文件的大小 压缩图像是场景细节的一种度量,而场景细节又是 聚焦功能(聚焦图像比模糊图像显示更多细节, 同一场景的焦距外视图)。如图23所示, 相机确定jpeg文件大小和电机之间的关系 计数并将抛物线拟合到三个相邻的最大文件大小。 抛物线的顶点提供最佳焦点的估计 电机计数位置。做出这一决定后,马利将 镜头焦距组到最佳运动位置并获得图像; 此图像被存储,用于确定 自动对焦位置未保存。

    自动对焦可以在 整个mahli视场,或者可以在子帧上执行 对应于场景中包含对象的部分 被研究。取决于主题的性质和 Mahli机器人手臂定位的不确定性,用户可能 选择获取居中的自动对焦子帧,或者他们可以选择 如果定位知识为 足以确定副车架的位置。使用 强烈建议使用子帧执行自动对焦,因为 通常导致受试者比实际情况更专注。 当自动对焦应用于整个CCD时,进一步地,结果 使用子帧自动对焦时的电机计数位置通常会导致 更准确地确定与像素刻度的工作距离。

    下图23:

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

    空间科学评论 2012年,170.1-4:259-317。

    它可以作为 PDF here .

    引自文章:

    7.2.2自动聚焦

    预计自动对焦是Mahli的主要方法。 专注于火星。autofocus命令指示相机移动到 指定的启动电机计数位置并采集图像,移动 指定步骤数并收集另一个图像,并继续执行此操作 直到达到命令的图像总数,每个图像由 指定的电机计数增量。这些图片都是jpeg 压缩(联合摄影专家组;见CCITT(1993))与 应用相同的压缩质量系数。每个文件的大小 压缩图像是场景细节的一种度量,而场景细节又是 聚焦功能(聚焦图像比模糊图像显示更多细节, 同一场景的焦距外视图)。如图23所示, 相机确定jpeg文件大小和电机之间的关系 计数并将抛物线拟合到三个相邻的最大文件大小。 抛物线的顶点提供最佳焦点的估计 电机计数位置。做出这一决定后,马利将 镜头焦距组到最佳运动位置并获得图像; 此图像被存储,用于确定 自动对焦位置未保存。

    自动对焦可以在 整个mahli视场,或者可以在子帧上执行 对应于场景中包含对象的部分 被研究。取决于主题的性质和 Mahli机器人手臂定位的不确定性,用户可能 选择获取居中的自动对焦子帧,或者他们可以选择 如果定位知识为 足以确定副车架的位置。使用 强烈建议使用子帧执行自动对焦,因为 通常导致受试者比实际情况更专注。 当自动对焦应用于整个CCD时,进一步地,结果 使用子帧自动对焦时的电机计数位置通常会导致 在更精确的确定工作距离的像素尺度。

    下图23:

    Autofocus in NASA Curiosity Mars Rover

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

        3
  •  3
  •   Gant    15 年前

    这可能有用。这就是相机的自动对焦系统的实际工作原理。- Passive Autofocus

    对比度测量

    对比度测量是通过 测量传感器内的对比度 场,通过镜头。强度 相邻像素之间的差异 传感器自然增加 正确的图像焦点。光学 因此,可以调整系统,直到 检测到最大对比度。在 这种方法,房颤不涉及 实际距离测量 通常比相位慢 检测系统,尤其是当 在昏暗的灯光下工作。确实如此 但是,不要使用单独的传感器, 对比度检测自动对焦可以更多 灵活(如 软件),可能更多 准确。这是一种常见的方法 摄像机和消费者水平 没有百叶窗和 反射镜。一些DSLR(包括 奥林巴斯E-420,松下L10,尼康 D90,尼康D5000,尼康D300三脚架 模式,佳能EOS 5D Mark II,佳能EOS 50d)对焦时使用此方法 他们的实时视图模式。一个新的 可互换透镜系统,微型 三分之四,仅使用对比度 测量自动对焦,据说 提供与阶段相当的性能 检测系统。

        4
  •  3
  •   user180326    15 年前

    我自己还没有做过一个,但我的第一个想法是在图像的一部分上做二维DFT。当失焦时,高频会自动消失。

    对于一个懒惰的原型,您可以尝试用jpeg(高质量)压缩图像的一个区域,并查看输出流的大小。一个大文件意味着很多细节,而这又意味着图像处于焦点位置。请注意,相机不应该太吵,而且您当然不能在不同的场景中比较文件大小。

        5
  •  1
  •   kenny    15 年前

    虽然Sobel是一个不错的选择,但我可能会选择在几个具有代表性的小区域内,对X和Y方向的投影进行边缘震级计算。另一个基于opencv的.NET友好选择是@ http://www.emgu.com/wiki/index.php/Main_Page .

        6
  •  0
  •   Niki    15 年前

    我想知道标准偏差是否是最佳选择:如果图像变得更清晰,Sobel滤波器图像的边缘将包含更亮的像素,但同时由于边缘变得更薄,明亮的像素更少。也许你可以尝试使用索贝尔图像中最高像素值1%的平均值?

        7
  •  0
  •   Vikdor    12 年前

    焦点度量的另一种风格可能是:

    抓取几个图像并取其平均值(降噪)。 然后对平均图像进行快速傅立叶变换,利用高低频能量比。 这个比例越高,焦点就越好。在工具箱的演示中提供了一个matlab演示(不包括平均阶段)。