USB显微镜自动对焦算法

Sub*_*niC 16 c# hardware algorithm image autofocus

我正在尝试为低成本的USB显微镜设计自动对焦系统.我一直在开发硬件方面,配备精密PAP电机,可以调整显微镜中的聚焦旋钮,现在我处在困难的部分.

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

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

我一直在googleling但没有成功...我会感谢任何帮助/想法/推荐!

非常感谢 :)

编辑:谢谢你的答案,我会尝试所有选项,并回到这里与结果(或更多的问题).

Cod*_*aos 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这些功能适用于单色图像,RGB图像只是对通道的值求和.

使用此功能可以更改焦点以尝试最大化CalculateFocusQuality.如果连续多次尝试提高了质量,则增加步长,如果步骤降低了质量,则减少步长并反转方向.


Dr.*_*ius 6

自动对焦微型镜是光学研究中的一个长期主题.
您可以在这里了解所涉及的算法.

所涉及的问题不仅包括如何确保散焦,还包括如何以最佳方式移动光轴,以及如何在算法上校正残余像差.

HTH!