确定图像是否模糊

时间:2018-02-19 11:16:52

标签: c# image image-processing fft

我看到很多关于此的话题,我理解了这个理论,但我无法对此进行编码。

我有一些照片,我想确定它们是否模糊。我找到了一个库(aforge.dll),我用它来为图像压缩FFT。

例如,我正在处理两个图像:

enter image description here

我的代码在c#中:

public Bitmap PerformFFT(Bitmap Picture)
{
    //Loade Image
    ComplexImage output = ComplexImage.FromBitmap(Picture);

    // Perform FFT
    output.ForwardFourierTransform();

    // return image
    return = output.ToBitmap();
}

如何判断图像是否模糊?我对这个理论不太满意,我需要具体的例子。我看到了this post,但我不知道该怎么做。

编辑:

我会澄清我的问题。当我有一个复杂ComplexImage output的二维数组(图像FFT)时,我可以使用什么C#代码(或伪代码)来确定图像是否模糊?

2 个答案:

答案 0 :(得分:2)

“模糊”的概念是主观的。高频多少功率表明它不模糊?注意,复杂场景的模糊图像在高频处具有比非常简单场景的清晰图像更多的功率。例如,完全均匀场景的清晰图像无论如何都没有高频。因此,无法定义独特的模糊度量。

可能的是比较同一场景的两个图像,并确定哪一个更模糊(或相同,哪一个更清晰)。这是自动聚焦中使用的。我不知道商用相机的使用过程究竟是什么,但在显微镜下,图像是在一系列焦点深度拍摄的,并进行了比较。

一种经典的比较方法根本不涉及傅里叶变换。一个计算局部方差(对于每个像素,在它周围取一个小窗口并计算这些值的方差),并在整个图像中对其进行平均。具有最高方差的图像具有最佳焦点。

比较MBo's answer中的高频和低频可以与计算Laplace filtered图像相比较,并对其绝对值求平均值(因为它可以返回负值)。拉普拉斯滤波器是高通滤波器,意味着去除了低频。由于高频中的功率给出了锐度的相对测量值,因此该统计量也是如此(再次相对,它仅与相同场景的图像进行比较,在相同的情况下拍摄)。

答案 1 :(得分:1)

模糊图像具有FFT结果,在高频区域具有较小幅度。低索引(近Result[0][0])的数组元素代表低频区域。

因此,根据某些标准对结果数组进行除法,将两个区域的总和进行比较并进行比较。例如,选择四分之一的结果数组(大小为M)index<M/2indexy<M/2

对于一系列越来越模糊的图像(对于相同的初始图像),您会看到越来越高的比率Sum(Low)/Sum(High)

结果是方阵NxN。它具有中心对称性(F(x,y)=F(-x,-y)因为源是纯粹的真实的),因此用y<N/2处理数组的上半部分就足够了。

低频分量位于阵列的左上角和右上角附近(y的最小值,x的最小值和最大值)。因此,数组元素的大小在范围

for y in range 0..N/2
   for x in range 0..N
      amp = magnitude(y,x)
      if (y<N/4) and ((x<N/4)or (x>=3*N/4))
          low = low + amp
      else                
          high = high + amp

请注意,您的图片显示了乱七八糟的数组 - 这是在中心显示零组件的标准做法。