【问题标题】:image focus calculation图像焦点计算
【发布时间】:2010-01-25 19:20:49
【问题描述】:

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

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

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

有没有更好的方法?

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

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

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

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

第 2 步:为我正在聚焦的对象找到一个边缘(在我的例子中,它是一个始终在同一个位置的矩形对象,因此我裁剪了一个边缘的 HIGH 和 NARROW 矩形)

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

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

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

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

【问题讨论】:

  • 我认为你至少在正确的轨道上。如果我没记错的话,数码相机中的自动对焦会做类似的事情。
  • 昨晚我在玩自动对焦相机时才意识到这一点。工作中的人本质上是一个愚蠢的针孔。启用自动对焦时,您通常可以听到呼呼声。也就是相机在不同距离采样并猜测最佳距离。

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


【解决方案1】:

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

本文介绍了该技术

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 的主要方法 专注于火星。自动对焦命令指示相机移动到 一个指定的启动电机计数位置并采集图像,移动一个 指定步数并收集另一张图像,并继续这样做 直到达到指定的图像总数,每个图像由 指定的电机计数增量。这些图像中的每一个都是JPEG 压缩(联合摄影专家组;参见 CCITT (1993)) 应用相同的压缩品质因数。每个文件的大小 压缩图像是场景细节的度量,反过来又是 对焦功能(对焦图像比模糊图像显示更多细节, 同一场景的失焦视图)。如图 23 所示, 相机决定JPEG文件大小和马达的关系 计数并将抛物线拟合到三个相邻的最大文件大小。 抛物线的顶点提供了对最佳焦点的估计 电机计数位置。做出这一决定后,MAHLI 将 镜头对焦组到最佳电机位置并获取图像; 此图像被存储,较早的图像用于确定 不保存自动对焦位置。

自动对焦可以在 整个 MAHLI 视场,或者它可以在一个子帧上执行 对应于包含对象的场景部分 被研究。视学科性质和所学知识而定 MAHLI 机械臂定位的不确定性,用户可能 选择获取居中的自动对焦子帧,或者他们可能会选择 如果定位知识是偏离中心的自动对焦子帧 足以确定子帧应位于何处。用于 强烈建议使用子帧来执行自动对焦,因为这 通常会导致主题比实际情况更好 当自动对焦应用于全 CCD 时;此外,由此产生的 使用子帧的自动对焦电机计数位置通常会产生 从像素尺度更准确地确定工作距离。

以下为图23:

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

【讨论】:

    【解决方案2】:

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

    中提到了它

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

    【讨论】:

    • 您的最后一点是我在星期五遇到的一个问题,当时我的相机开始时离 IC 太远了。当我想到我总是要处于相同的高度以获得最佳焦点时,我绕过了它,所以我只需要从稍微失焦的图像变为清晰的图像。顺便说一句,那篇文章非常棒。尤其是因为拍摄微生物的照片与拍摄 IC 非常接近,而这正是我正在做的。
    • @Stew BRENNER, John F. 等人。用于细胞学研究的自动显微镜进行初步评估。 组织化学与细胞化学杂志,1976,24.1:100-111。 jhc.sagepub.com/content/24/1/100.full.pdf
    【解决方案3】:

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

    对比度测量

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

    【讨论】:

    • 像素之间的强度差异非常接近 sobel 运算给出的值。
    【解决方案4】:

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

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

    【讨论】:

    • 关于原型的好主意!不错。
    【解决方案5】:

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

    【讨论】:

    • 我没有意识到 opencv 是 .net。我想我错误地认为它是 c++ 并且没有进行更多研究就继续前进(在我的辩护中,研究是由其他人开始的)
    • 它是 C/C++,但提供的链接是 DLL 的 C# 包装器。
    【解决方案6】:

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

    【讨论】:

    • 按照我选择标准差的相同逻辑。图片越清晰,对比度越高,直方图中的变化就越小。如果我抓取一些最高的像素值(即获得最亮的点),那么与这张照片中的所有其他点相比,这只会告诉我这张照片上有多少亮点。即图表滑动变化:聚焦镜头:平均= 23,标准偏差= 15 稍微失焦:平均:27,标准偏差= 16 真正失焦:平均:40,标准偏差= 20
    【解决方案7】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多