如何检测图像何时失焦?

时间:2013-04-05 17:28:48

标签: image-processing focus

有时我们的光学检测系统失焦,导致无意义的测量。我的任务是开发一种“失焦”探测器,用于驱动摄像系统的Z轴。我可以获得的图像是bmp。

我正在寻找方法和算法来调查。例如,我应该使用隔离功能并测量一致性还是使用边缘检测?

这是焦点图像:

in focus


这是失焦的形象:

out of focus

3 个答案:

答案 0 :(得分:10)

关键是焦点对准的图像具有更强的渐变和锐利的特征。 所以我建议应用高斯拉普拉斯滤波器,然后查看结果的像素值的分布。下图显示了这个想法在您的图像中的应用,其中黑色表示失焦图像,红色表示焦点图像。对焦一个具有更高的值(因为图像具有更尖锐的渐变)。

当你有直方图时,你可以通过比较例如来区分直方图。 90%百分位数的分布(对尾部敏感)。 对于失焦图像,它是7 对于对焦图像,它是13.6(差异的两倍)。

enter image description here

答案 1 :(得分:1)

对比度算法的快速和肮脏版本是对相邻像素之间的差异求和 - 更高的和是更多的对比度。

答案 2 :(得分:0)

我在OpenCV中做的是检测焦点质量:

Mat grad;
int scale = 1;
int delta = 0;
int ddepth = CV_8U;
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
/// Gradient X
Sobel(matFromSensor, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);
/// Gradient Y
Sobel(matFromSensor, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
cv::Scalar mu, sigma;
cv::meanStdDev(grad, /* mean */ mu, /*stdev*/ sigma);
focusMeasure = mu.val[0] * mu.val[0];