【问题标题】:Detection of Blur in Images/Video sequences图像/视频序列中的模糊检测
【发布时间】:2011-07-08 00:14:36
【问题描述】:

我曾在 photo stackexchange 上问过这个问题,但我认为它在这里也可能是相关的,因为我想在我的实现中以编程方式实现这个。

我正在尝试为我的成像​​管道实施模糊检测算法。我想检测的模糊是 -

1) 相机抖动:使用手拍摄的照片,当快门速度较慢时会移动/抖动。

2) 镜头对焦错误 - (景深)问题,例如对焦不正确的对象会导致一些模糊。

3) 运动模糊:场景中快速移动的物体,使用不够高的快门速度拍摄。例如。夜间行驶的汽车可能会在图像中以模糊的形式显示其头灯/尾灯的轨迹。

如何检测这种模糊并以某种方式对其进行量化,以根据计算出的“模糊指标”做出决定?

模糊检测背后的理论是什么?

我正在寻找好的阅读材料,我可以使用这些材料在 C/Matlab 中实现一些算法。

谢谢。

-AD。

【问题讨论】:

    标签: image-processing


    【解决方案1】:

    这里需要注意的重要一点是,图像可能有一些模糊区域和一些清晰区域。例如,如果图像包含人像摄影,则前景中的图像清晰而背景模糊。在运动摄影中,对焦的对象很清晰,背景通常有运动模糊。检测图像中这种空间变化模糊的一种方法是在图像中的每个位置运行频域分析。其中一篇涉及该主题的论文是“基于梯度大小的多尺度融合和排序变换系数的空间变化模糊检测”(cvpr2017)。

    作者查看每个像素的多分辨率 DCT 系数。这些DCT系数分为低、中、高频段,其中仅选择高频系数。 然后将 DCT 系数融合在一起并排序以形成多尺度融合和排序的高频变换系数 选择这些系数的子集。所选系数的数量是特定于应用程序的可调参数。 然后通过最大池块发送选定的系数子集,以保留所有尺度内的最高激活。这将模糊贴图作为输出,然后通过后处理步骤发送以优化贴图。 此模糊图可用于量化图像各个区域的清晰度。为了得到一个单一的全局度量来量化整个图像的模糊度,可以使用这个模糊图的均值或者这个模糊图的直方图

    以下是该算法如何执行的一些示例结果:

    图像中的锐利区域在 blur_map 中具有高强度,而模糊区域具有低强度。

    项目的github链接为:https://github.com/Utkarsh-Deshmukh/Spatially-Varying-Blur-Detection-python

    这个算法的python实现可以在pypi上找到,安装很方便,如下图:

    pip install blur_detector

    生成模糊图的示例代码sn-p如下:

    import blur_detector
    import cv2
    if __name__ == '__main__':
        img = cv2.imread('image_name', 0)
        blur_map = blur_detector.detectBlur(img, downsampling_factor=4, num_scales=4, scale_start=2, num_iterations_RF_filter=3)
    
        cv2.imshow('ori_img', img)
        cv2.imshow('blur_map', blur_map)
        cv2.waitKey(0)
    

    【讨论】:

      【解决方案2】:

      有一篇很棒的论文叫做:“analysis of focus measure operators for shape-from-focus”(https://www.researchgate.net/publication/234073157_Analysis_of_focus_measure_operators_in_shape-from-focus),它对 30 种不同的技术进行了比较。

      在所有不同的技术中,基于“拉普拉斯算子”的方法似乎具有最佳性能。大多数图像处理程序,如:MATLAB 或 OPENCV 已经实现了这种方法。下面是一个使用 OpenCV 的例子:http://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/

      【讨论】:

      • 我已经阅读了那篇论文,但无法得出基于拉普拉斯算子的方法是最好的结论。请问你是怎么总结的?@rugby2312
      • 论文的结论是“实验表明,基于拉普拉斯算子的算子在正常成像条件下具有最佳的整体性能”。这些方法可从此处的 matlab 文件交换中获得:au.mathworks.com/matlabcentral/fileexchange/27314-focus-measure
      【解决方案3】:

      只是为了增加聚焦误差,这些可以通过比较捕获的模糊图像(更宽)与参考图像(更清晰)的 psf 来检测。反卷积技术可能有助于纠正它们,但会留下人为错误(阴影、波纹等)。光场相机可以帮助重新聚焦到任何深度平面,因为它可以捕捉场景中传统空间信息之外的角度信息。

      【讨论】:

        【解决方案4】:

        当您考虑原因时,运动模糊和相机抖动是一回事:相机和物体的相对运动。您提到了慢速快门——这两种情况都是罪魁祸首。

        对焦失误是主观的,因为它们取决于摄影师的意图。如果不知道摄影师想要关注的什么,就不可能做到这一点。即使您确实知道自己想专注于什么,这也不是小事。

        抛开现实主义,让我向您保证,模糊检测实际上是一个非常活跃的研究领域,并且已经有一些指标您可以尝试在你的图像上。以下是我最近使用的一些:

        • 边缘宽度。基本上,对图像执行边缘检测(使用Canny 或其他方式),然后测量边缘的宽度。模糊的图像将具有更宽的边缘,更分散。更清晰的图像将具有更薄的边缘。谷歌Marziliano 的“无参考感知模糊度量”——这是一篇著名的论文,它很好地描述了这种方法,足以实现完整的实现。如果您正在处理运动模糊,那么边缘将在运动方向上变得模糊(宽)。
        • 存在精细的细节。看看我对this question 的回答(已编辑部分)。
        • 频域方法。获取图像的 DCT 系数的直方图(假设您使用的是 JPEG)可以让您了解图像具有多少精细细节。 This is how 您直接从 JPEG 文件中获取 DCT 系数。如果非 DC 项的计数较低,则图像很可能是模糊的。这是最简单的方法 - 在频域中有更复杂的方法。

        还有更多,但我觉得这应该足以让您入门。如果您需要关于其中任何一点的更多信息,请打开Google Scholar 并环顾四周。特别是,请查看 Marziliano 论文的参考文献,了解过去曾尝试过的方法。

        【讨论】:

        • 感谢您的指点。它肯定让我开始了!如果我对 Marziliano 等人的论文的实施有任何疑问,在我初步阅读该材料和其他材料之后,您会介意吗?如果是的话,你会在我的 stackoverflow 个人资料页面上留下你的电子邮件 ID。我的电子邮件 ID 已编码在我的个人资料页面上。
        • 基于 SSIM 的细节分析可能需要参考图像,而我没有。我需要进行“无参考”模糊度量计算。
        • @goldenman 更仔细地阅读了与 SSIM 相关的问题。它在无参考场景中使用 SSIM(通过使用输入图像的迭代降级副本作为参考)。
        猜你喜欢
        • 2012-11-25
        • 2017-12-21
        • 2013-10-26
        • 2021-04-26
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        相关资源
        最近更新 更多