Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# USB显微镜的自动对焦算法_C#_Algorithm_Image_Hardware_Autofocus - Fatal编程技术网

C# USB显微镜的自动对焦算法

C# USB显微镜的自动对焦算法,c#,algorithm,image,hardware,autofocus,C#,Algorithm,Image,Hardware,Autofocus,我正试图为一个低成本的USB显微镜设计一个自动对焦系统。我一直在开发硬件方面的精密PAP电机,能够调整中的焦点旋钮,现在我在硬的部分 我一直在考虑如何实现这个软件。硬件有两个USB端口,一个用于显微镜摄像头,另一个用于电机。我最初的想法是用C语言编写一个应用程序,它可以从显微镜上获取图像,并可以前后移动电机,目前为止还不错:) 现在我需要一些关于自动对焦的帮助,如何实现它?有什么好的算法吗?或者一个图像处理库可以帮助我完成任务 我一直在谷歌搜索,但没有成功。。。我将感谢任何帮助/想法/建议 非常

我正试图为一个低成本的USB显微镜设计一个自动对焦系统。我一直在开发硬件方面的精密PAP电机,能够调整中的焦点旋钮,现在我在硬的部分

我一直在考虑如何实现这个软件。硬件有两个USB端口,一个用于显微镜摄像头,另一个用于电机。我最初的想法是用C语言编写一个应用程序,它可以从显微镜上获取图像,并可以前后移动电机,目前为止还不错:)

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

我一直在谷歌搜索,但没有成功。。。我将感谢任何帮助/想法/建议

非常感谢:)


编辑:谢谢大家的回答,我将尝试所有选项,然后返回这里,返回结果(或者更多问题)。

有一些关于

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


另外,在我通过谷歌搜索“自动对焦算法”得到的前6个匹配项中,有5个似乎有相关和有用的信息(尽管在一两个案例中,论文的全部细节都需要付款)

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

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(字节[,]像素)
{
长和=0;

对于(int y=0;y自动聚焦显微镜是光学研究中的一个长期课题。
您可以了解一些相关的算法

所涉及的问题不仅包括如何测量离焦,还包括如何以最佳方式移动光轴,以及如何对残余像差进行算法校正


HTH!

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

我面临的问题是: -抖动。由于突然抖动,理论上较好位置上的图像可能会评估得更差。由于我系统的API不允许移动z轴并平行制作图像,我必须分步移动并依次拍摄。每次移动停止都会导致抖动。有趣的是,向下移动时抖动比向上移动时更严重。

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

-曝光:取决于应用,图像的亮度可能会有所不同,因此需要调整曝光。取决于焦距评估算法(亮度是否参与计算)曝光可能需要固定。这导致了鸡蛋问题——如果图像亮度未知,如何设置曝光,如果所需曝光未知,如何对焦

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

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

这听起来和这个问题很相似-没错,我以前没有展示过那篇文章。谢谢。@SubniC另请看@Alessandro Jacopson thx很好的阅读,我想尝试一下这种方法:)你好,保罗,谢谢你的时间回答,我已经知道维基百科页面,在搜索之前从来没有问过。也许我对谷歌不是很清楚:)我找了它,但我没有找到任何我能理解的算法,我的数学背景不是很强,因此我在这里寻求帮助。我会尝试学习它,如果我不能,我会找到一些帮助帮帮我。但一开始,这里的人能让你找到正确的方向真是太好了:)我很困惑你如何在没有“数字处理”的情况下实现高通滤波器。你不能在USB信号上挂一个电容器。@Hans Passant:这是维基百科文章中的一段引语,当然不局限于我们B.它说,你可以在模拟相机的输出上使用模拟高通滤波器来实现自动对焦。呵呵,闯入博物馆获取相机会让他陷入麻烦:)嗨,贝里萨利斯,非常有趣的论文,我将尝试获取一些可以帮助我的信息。问候。感谢CodeInChaos,我将尝试你的snnipet和t告诉你它是如何工作的:)你的算法中有一个小错误:你的y形圈将x与高度进行比较。另外,第二个算法对全白色图像的评分不是比黑白交替棋盘模式的评分更高吗?这似乎是错的,因为棋盘“更聚焦”@noroom谢谢。两个算法都没有达到我的预期。现在应该修复。如果您发现其他错误,请告诉我。
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;
}