16

我正在尝试为低成本 USB 显微镜设计自动对焦系统。我一直在用能够调节显微镜聚焦旋钮的精密 PAP 电机开发硬件方面,现在我正处于困难的部分。

我一直在思考如何实现这个软件。硬件有两个 USB 端口,一个用于显微镜摄像头,另一个用于电机。我最初的想法是用 C# 编写一个应用程序,它能够从显微镜中获取图像并前后移动电机,到目前为止一切都很好:)

现在我需要一些关于自动对焦的帮助,如何实现它?有什么好的算法吗?或者也许是一个可以帮助我完成任务的图像处理库?

我一直在用谷歌搜索,但没有成功......我将不胜感激任何帮助/想法/建议!

非常感谢 :)

编辑:谢谢大家的回答,我会尝试所有选项并返回结果(或者可能更多问题)。

4

4 回答 4

8

最重要的部分是代码,它告诉您图像离焦的程度。由于未聚焦的图像会丢失高频数据,我会尝试以下方法:

long CalculateFocusQuality(byte[,] pixels)
{
  long sum = 0;
  for(int y = 0; y<height-1; y++)
    for(int x=0; x<width-1; x++)
    {
      sum += Square(pixels[x+1, y] - pixels[x, y]);
      sum += Square(pixels[x, y] - pixels[x, y+1]);
    }
  return sum;
}

int Square(int x)
{
  return x*x;
}

如果图像有噪声,该算法就不能很好地工作。在这种情况下,您可以对其进行下采样,或者使用更复杂的算法。

或者另一个想法是计算像素值的变化:

long CalculateFocusQuality(byte[,] pixels)
{
  long sum = 0;
  long sumOfSquares = 0;
  for(int y=0; y<height; y++)
    for(int x=0; x<width; x++)
    {
      byte pixel=pixels[x,y];
      sum+=pixel;
      sumofSquares+=pixel*pixel;
    }
  return sumOfSquares*width*height - sum*sum;
}

这些函数适用于单色图像,因为 RGB 图像只是对通道的值求和。

使用这个功能改变焦点试图最大化CalculateFocusQuality。如果连续几次尝试提高了质量,则增加 stepsize,如果 step 降低质量,则减小它并反转方向。

于 2010-11-19T12:22:48.427 回答
7

显微镜自动对焦是光学研究中长期存在的课题。您可以在此处
了解有关所涉及算法的一些信息。

所涉及的问题不仅是如何测量散焦,还包括如何以最佳方式移动光轴,以及如何通过算法校正残余像差。

于 2010-11-19T12:39:28.293 回答
1

只是我尝试解决类似任务的一些经验。在我的系统上使用了 200 倍放大镜。Z方向的步进分辨率0.001um。

我面临的问题: - 摇晃。由于突然晃动,理论上更好位置上的图像可能会被评估为更差。由于我的系统的 API 不允许移动 z-axix 和并行制作图像,我必须逐步移动并按顺序捕获。每一次移动停止都会引起震动。有趣的是,向下移动时的震动比向上移动时更剧烈。

-机械不精确。进行扫描并移动到理论上的最佳位置可能会产生误差,因为控制器中的步进位置可能与机械位置不同。

-曝光:根据应用的不同,图像的亮度可能会有所不同,因此应调整曝光。根据焦点评估算法(计算中是否涉及亮度),可能需要固定曝光。这导致了鸡蛋问题 - 如何设置曝光,如果图像亮度未知以及如何聚焦,如果需要的曝光未知。

最后,为了避免机械问题,我(重新)存储了在对焦时找到的最佳图像,并在最后返回。关于焦点值的算法,最好的方法是寻找与颜色总数(直方图宽度)相结合的边缘。但当然,这取决于您处理的图像类型。

问候, 瓦伦丁·海尼茨

于 2012-05-29T17:32:57.337 回答
0

维基百科上有一些信息

从技术上讲,它可以实现为高通滤波器和一些系统,它会认真地将镜头移动到滤波器输出最高的点周围。不需要数字处理

此外,我从谷歌搜索“自动对焦算法”获得的前 6 场比赛中有 5 场似乎有相关和有用的信息(尽管在一到两种情况下,论文的全部细节需要付费)

于 2010-11-19T12:20:27.187 回答