我正在尝试为低成本USB显微镜设计自动对焦系统。我一直在开发硬件方面,配备精密PAP电机,可以调整microscope中的焦点旋钮,现在我处在困难的部分。
我一直在考虑如何实施该软件。硬件有两个USB端口,一个用于显微镜摄像头,另一个用于电机。我最初的想法是在C#中编写一个能够从显微镜获取图像并向前和向后移动电机的应用程序,到目前为止一直很好:)
现在我需要一些关于自动对焦的帮助,如何实现它?这有什么好的算法吗?或者也许是一个图像处理库,可以帮助我完成任务?
我一直在googleling但没有成功......我会感激任何帮助/想法/推荐!
非常感谢:)
编辑:感谢大家的回答,我会尝试所有选项并回到这里查看结果(或者更多问题)。
答案 0 :(得分: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
。如果连续多次尝试提高了质量,则增加步长,如果步骤降低了质量,则减少步长并反转方向。
答案 1 :(得分:6)
答案 2 :(得分:0)
从技术上讲,它可以实现为 高通滤波器和一些系统 认真地移动镜头周围 滤波器输出最高的点。 不需要数字处理
此外,我从Googling获得的“自动对焦算法”中的前6场比赛中有5场似乎有相关且有用的信息(尽管在一两个案例中,论文的完整细节需要付款)
答案 3 :(得分:0)
我尝试解决类似任务的一些经历。在我的系统中使用200倍的magnificatin。 Z方向上的步进分解素0.001um。
我遇到的问题: -Shaking。理论上更好的位置的图像可能会因为突然发抖而被评估得更糟。由于我的系统的API不允许移动z-axix并使图像并行,我不得不分步移动并且后续捕获。每次移动都会引起晃动。有趣的是,在向下移动时摇晃比向上移动更严重。
- 机械不精确。进行扫描并移动到理论上最佳位置可能会出错,因为控制器中的步进位置可能与机械位置不同。
- 曝光:根据应用程序的不同,图像的亮度可能会有所不同,因此应调整曝光。根据聚焦评估算法(计算中是否涉及亮度),可能需要修复曝光。这导致鸡蛋问题 - 如果图像亮度未知,如何设置曝光以及如何聚焦,如果需要曝光未知。
最后,为了避免机械问题,我(重新)存储了在聚焦时找到的最佳图像并在最后返回它。 关于聚焦值的算法,最好的是寻找与整数个颜色(直方图宽度)相结合的边缘。但最重要的是,这取决于您处理的图像类型。
此致 Valentin Heinitz