我在照片stackexchange上问过这个问题,但认为它也可能与此相关,因为我想在我的实现中以编程方式实现它。
我正在尝试为我的成像管道实现模糊检测算法。我想要检测的模糊是 -
1)相机抖动:使用手拍摄的照片,当快门速度较低时移动/抖动。
2)镜头聚焦误差 - (景深)问题,例如聚焦于不正确的物体导致模糊。
3)运动模糊:使用不够高的快门速度拍摄场景中的快速移动物体。例如。一夜之间行驶的汽车可能会在图像中显示其前灯/尾灯的痕迹。
如何检测这种模糊并以某种方式对其进行量化,以根据计算出的“模糊指标”做出决定?
模糊检测背后的理论是什么?
我正在寻找好的阅读材料,我可以在C / Matlab中为此实现一些算法。
谢谢。-AD。
答案 0 :(得分:36)
当您考虑原因时,运动模糊和相机抖动是一回事:相机和物体的相对运动。你提到慢速快门 - 这是两种情况下的罪魁祸首。
焦点失误是主观的,因为它们取决于摄影师的意图。如果不知道摄影师想要关注的 ,就不可能实现这一目标。即使你做知道你想要关注什么,它仍然不会是微不足道的。
除了那种现实主义之外,让我向你保证,模糊检测实际上是一个非常活跃的研究领域,并且已经有一些指标你可以尝试出你的图像。以下是我最近使用过的一些内容:
还有更多,但我觉得这应该足以让你开始。如果您需要有关这两个点的更多信息,请启动Google Scholar并环顾四周。特别要查看Marziliano的论文,以了解过去曾尝试过的内容。
答案 1 :(得分:6)
有一篇很棒的论文叫做:“焦点测量操作符分析焦点形状”(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/
答案 2 :(得分:0)
只是为了增加聚焦误差,可以通过将捕获的模糊图像(更宽)的psf与参考图像(更锐利)进行比较来检测这些误差。反卷积技术可能有助于纠正它们,但会留下人为错误(阴影,波纹......)。光场相机可以帮助重新聚焦到任何深度平面,因为它捕获除了传统空间场景之外的角度信息。
答案 3 :(得分:0)
这里需要注意的一个重点是图像可能有一些模糊区域和一些清晰区域。例如,如果图像包含人像摄影,则前景中的图像清晰,而背景中的图像模糊。在体育摄影中,对焦的物体很清晰,背景通常有运动模糊。检测图像中这种空间变化模糊的一种方法是在图像中的每个位置运行频域分析。其中一篇论文是“基于梯度幅度的多尺度融合和排序变换系数的空间变化模糊检测”(cvpr2017)。
作者查看每个像素的多分辨率 DCT 系数。这些 DCT 系数分为低、中和高频段,其中仅选择高频系数。 然后将 DCT 系数融合在一起并排序,形成多尺度融合排序的高频变换系数 选择这些系数的子集。所选系数的数量是特定于应用程序的可调参数。 然后将选定的系数子集通过最大池块发送,以保留所有尺度内的最高激活。这给出了模糊贴图作为输出,然后通过后处理步骤发送以优化贴图。 该模糊图可用于量化图像各个区域的锐度。为了得到一个单一的全局度量来量化整个图像的模糊度,可以使用这个模糊图的均值或这个模糊图的直方图
以下是有关算法如何执行的一些示例结果:
图像中清晰的区域在 blur_map 中强度较高,而模糊区域的强度较低。
项目的github链接是:https://github.com/Utkarsh-Deshmukh/Spatially-Varying-Blur-Detection-python
这个算法的python实现可以在pypi上找到,安装很方便,如下图:
pip install blur_detector
生成模糊图的示例代码片段如下:
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)