检测图像的模糊程度

时间:2013-10-18 07:24:43

标签: opencv image-processing blur motion-blur

我想检测图像的模糊程度,可能是“模糊延伸”。 我找到了一篇有用的论文:

http://www.cs.cmu.edu/~htong/pdf/ICME04_tong.pdf

我使用了OpenCV并实现了本文的所有步骤,但结果与本文的结果不同。

有人可以给我任何关于检测“模糊延伸”的建议吗?

3 个答案:

答案 0 :(得分:3)

您可以使用下一个算法检测模糊图像:

  1. 将图像转换为灰色格式。
  2. 计算灰度图像的最大绝对二阶导数(对于每个点):

    d[x,y] = max(abs(2*d[x,y] - d[x,y+1] -d[x,y-1]), abs(2*d[x,y] - d[x+1,y] -d[x-1,y]));
    
  3. 计算此估计图像的直方图(最大绝对二阶导数)。

  4. 找到此直方图的上分位数(0,999)。

  5. 如果此值小于阈值(图像动态范围约为25%),则图像模糊。

  6. 如果要估算模糊值,请执行步骤2-5以缩小图像。

  7. 您可以自己编写这些算法,也可以使用Simd Library的实现方法(免责声明:我是作者)。

    • Simd::BgrToGraySimd::BgraToGray(针对第1步)。
    • Simd::AbsSecondDerivativeHistogram(步骤2-5)。
    • Simd::ReduceGray2x2(步骤6)。

答案 1 :(得分:0)

Ermlg的答案似乎是最好的,但是通过这种方式,我实现了这一目标。

低于100的分数给了我一些模糊的图像。

# applying fast fourier transform to fin d the blur images , taken threshold to be 100 but it can vary

import cv2

def variance_of_laplacian(frame_path):
    # compute the Laplacian of the image and then return the focus
    # measure, which is simply the variance of the Laplacian
    image = cv2.imread(frame_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return cv2.Laplacian(gray, cv2.CV_64F).var()

方法的来源是adrian rosebrock

答案 2 :(得分:0)

这里需要注意的一个重点是图像可能有一些模糊区域和一些清晰区域。例如,如果图像包含人像摄影,则前景中的图像清晰,而背景中的图像模糊。在体育摄影中,对焦的物体很清晰,背景通常有运动模糊。检测图像中这种空间变化模糊的一种方法是在图像中的每个位置运行频域分析。其中一篇讨论该主题的论文是 "Spatially-Varying Blur Detection Based on Multiscale Fused and Sorted Transform Coefficients of Gradient Magnitudes" (cvpr2017)

  • 作者查看了每个像素的多分辨率 DCT 系数。这些 DCT 系数被分为频段,其中只选择高频系数。
  • 然后将 DCT 系数融合在一起并排序以形成 multiscale-fused and sorted high-frequency transform coefficients
  • 选择这些系数的一个子集。所选系数的数量是特定于应用程序的可调参数。
  • 然后将选定的系数子集通过最大池块发送,以保留所有尺度内的最高激活。这将给出模糊贴图作为输出,然后通过后处理步骤发送以优化贴图。

此模糊图可用于量化图像各个区域的锐度。为了得到一个单一的全局度量来量化整个图像的模糊度,可以使用这个模糊图的平均值或这个模糊图的直方图

以下是有关算法执行方式的一些示例结果: enter image description here

图像中清晰的区域在 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)