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

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

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

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

非常感谢 :)

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

有帮助吗?

解决方案

最重要的部分是告诉您图像失焦程度的代码。由于未聚焦的图像会丢失高频数据,因此我会尝试如下操作:

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. 。如果连续多次尝试提高了质量,则增加步长;如果步长降低了质量,则减少步长并反转方向。

其他提示

显微镜自动对焦是光学研究中一个长期存在的话题。
你可以了解一下涉及到的算法 这里.

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

哈!

有一些信息关于 维基百科

从技术上讲,它可以用作高通滤波​​器和某些系统,这些系统认真地将镜头移动到滤波器输出最高点的位置。不需要数字处理

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

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

我遇到的问题:-颤抖。理论上较好位置的图像可能会因为突然晃动而被评估得更差。由于我的系统的 API 不允许移动 z 轴并并行生成图像,因此我必须逐步移动并按顺序捕获。每次移动停止都会引起震动。有趣的是,向下移动时的震动比向上移动时更严重。

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

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

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

问候,瓦伦丁·海尼茨(Valentin Heinitz)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top