USB显微镜自动对焦算法
题
我正在尝试为低成本 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)