如何检测图像是否失焦?

问题描述 投票:0回答:3

有时我们的光学检测系统会失焦,从而导致无意义的测量。我的任务是开发一个“失焦”探测器,用于驱动相机系统的 Z 轴。我可用的图像是 bmp。

我正在寻找研究方法和算法。例如,我应该隔离特征并测量一致性,还是可以使用边缘检测?

这是对焦图像: 聚焦

这是失焦图像: 对焦不准

image-processing focus
3个回答
13
投票

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

当您拥有直方图时,您可以通过比较(例如)来区分直方图和直方图。分布的第 90% 个百分位数(对尾部敏感)。 对于失焦图像,该值为 7 对于对焦图像,该值为 13.6(差值的两倍)。

enter image description here


2
投票

这就是我在 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];

1
投票

对比度算法的一个快速但肮脏的版本是对相邻像素之间的差异求和 - 总和越高,对比度越高。

© www.soinside.com 2019 - 2024. All rights reserved.