【问题标题】:How to detect when an image is out of focus?如何检测图像何时失焦?
【发布时间】:2023-03-23 11:58:01
【问题描述】:

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

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

这是焦点图像:


这是失焦图像:

【问题讨论】:

  • 在这种情况下,您是否有多个相同对象的图像,您的任务是确定哪些图像失焦,或者您是否需要确定某些任意图像是否失焦?

标签: image-processing focus


【解决方案1】:

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

当你有直方图时,你可以通过比较来区分一个。分布的百分之九十(对尾部敏感)。 对于失焦图像,它是 7 而对于对焦图像,它是 13.6(相差两倍)。

【讨论】:

  • 这些值是如何确定的?谢谢。
  • 应用高斯拉普拉斯之后,你是如何构建直方图的?是像素的亮度值吗?
  • 是的。原始图像是灰度(单通道),过滤器的应用只是给出了另一个图像。直方图显示其像素值的分布。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2016-07-08
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多