计算图像方差背后的理论是什么?

den*_*631 8 opencv pixel blurry variance computer-vision

我试图通过使用LaplacianFilter来计算图像的模糊度.

根据这篇文章:https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/我必须计算输出图像的方差.问题是我从概念上不了解如何计算图像的方差.

每个像素对于每个颜色通道都有4个值,因此我可以计算每个通道的方差,但是我通过计算方差 - 协方差矩阵获得4个值,甚至16个,但根据OpenCV示例,它们只有1个数字.

在计算该数字之后,他们只是使用阈值来进行二元判定,无论图像是否模糊.

PS.我绝不是这方面的专家,因此我的陈述毫无意义.如果是这样,请很高兴编辑问题.

Kin*_*t 金 9

关于句子描述:

图像的模糊边缘是smoothed,因此variance很小。


1.如何计算方差。

帖子的核心功能是:

def variance_of_laplacian(image):
    # compute the Laplacian of the image and then return the focus
    # measure, which is simply the variance of the Laplacian
    return cv2.Laplacian(image, cv2.CV_64F).var()
Run Code Online (Sandbox Code Playgroud)

正如Opencv-Python用于numpy.ndarray表示图像一样,我们来看看numpy.var

Help on function var in module numpy.core.fromnumeric:

var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<class 'numpy._globals$
    Compute the variance along the specified axis.

    Returns the variance of the array elements, a measure of the spread of a distribution.
    The variance is computed for the flattened array by default, otherwise over the specified axis.
Run Code Online (Sandbox Code Playgroud)

2.用于图片

这就是说,var是在平坦的拉普拉斯图像或平坦的一维数组上计算的。

要计算variancearray x,它是:

var = mean(abs(x - x.mean())**2)


例如:

>>> x = np.array([[1, 2], [3, 4]])
>>> x.var()
1.25
>>> np.mean(np.abs(x - x.mean())**2)
1.25
Run Code Online (Sandbox Code Playgroud)

对于拉普拉斯图像,它是edged图像。使用GaussianBlur和制作图像r,然后laplacian filter对其进行处理,然后计算var:

在此处输入图片说明

图像的模糊边缘为smoothed,因此该边缘variance很小。


api*_*i55 7

首先,如果您看到了所给的教程,他们会将图像转换为灰度,因此它将只有1个通道和1个方差。您可以为每个通道执行此操作,并尝试使用它来计算更复杂的公式,或者仅对所有数字使用方差...但是,我认为作者也将其转换为灰度,因为这是融合信息的好方法在作者提供的其中一篇论文中实际上说

聚焦良好的图像有望具有较高的灰度变化。

该教程的作者实际上以一种简单的方式对其进行了解释。首先,请考虑拉普拉斯过滤器的作用。它将显示轮廓分明的边缘,这是使用他拥有的图片网格的示例。(单击以查看详细信息)

在此处输入图片说明

如您所见,模糊的图像几乎没有边缘,而聚焦的图像有很多响应。现在,如果您计算方差会发生什么。让我们想象一下白色为255而黑色为0的情况。如果一切都是黑色...,则方差低(模糊情况),但是如果它们有一半一样,则方差高。

但是,正如作者已经说过的那样,该阈值取决于域,即使您对天空拍照,即使它是聚焦的,它也可能具有低方差,因为它非常相似并且没有很好的定义边缘。 。

我希望这能回答您的疑问:)