首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一种方法可以检测图像是否模糊?

有没有一种方法可以检测图像是否模糊?
EN

Stack Overflow用户
提问于 2011-10-14 17:41:53
回答 7查看 160K关注 0票数 217

我想知道是否有一种方法可以通过分析图像数据来确定图像是否模糊。

EN

回答 7

Stack Overflow用户

发布于 2011-10-14 20:42:03

估计图像清晰度的另一种非常简单的方法是使用拉普拉斯(或LoG)滤波器,然后简单地选取最大值。如果你期望噪声,那么使用99.9%分位数这样的稳健度量可能会更好(即选择第N位最高的对比度,而不是最高的对比度)。如果您期望图像亮度发生变化,则还应包含一个预处理步骤来归一化图像亮度/对比度(例如直方图均衡化)。

我已经在Mathematica中实现了Simon的建议和这个建议,并在一些测试图像上进行了尝试:

第一个测试使用具有不同核大小的高斯滤波器模糊测试图像,然后计算模糊图像的FFT,并取90%最高频率的平均值:

代码语言:javascript
复制
testFft[img_] := Table[
  (
   blurred = GaussianFilter[img, r];
   fft = Fourier[ImageData[blurred]];
   {w, h} = Dimensions[fft];
   windowSize = Round[w/2.1];
   Mean[Flatten[(Abs[
       fft[[w/2 - windowSize ;; w/2 + windowSize, 
         h/2 - windowSize ;; h/2 + windowSize]]])]]
   ), {r, 0, 10, 0.5}]

结果是一个对数图:

这5条线表示5个测试图像,X轴表示高斯滤波器半径。图形正在减少,因此FFT是一个很好的清晰度衡量标准。

这是“最高LoG”模糊度估计器的代码:它简单地应用LoG过滤器,并在过滤器结果中返回最亮的像素:

代码语言:javascript
复制
testLaplacian[img_] := Table[
  (
   blurred = GaussianFilter[img, r];
   Max[Flatten[ImageData[LaplacianGaussianFilter[blurred, 1]]]];
   ), {r, 0, 10, 0.5}]

结果是一个对数图:

在这里,未模糊图像的展开稍好一些(2.5 vs 3.3),主要是因为此方法仅使用图像中的最强对比度,而FFT本质上是整个图像的平均值。函数的减少速度也更快,因此设置“模糊”阈值可能会更容易。

票数 166
EN

Stack Overflow用户

发布于 2013-11-26 00:38:01

我想出了一个完全不同的解决方案。我需要分析视频静止帧,以找到每(X)帧中最清晰的一帧。这样,我就可以检测到运动模糊和/或散焦图像。

我最终使用了Canny边缘检测,几乎所有类型的视频我都得到了非常非常好的结果(使用nikie的方法,我在数字化VHS视频和大量隔行扫描视频方面遇到了问题)。

我通过在原始图像上设置感兴趣区域(ROI)来优化性能。

使用EmguCV:

代码语言:javascript
复制
//Convert image using Canny
using (Image<Gray, byte> imgCanny = imgOrig.Canny(225, 175))
{
    //Count the number of pixel representing an edge
    int nCountCanny = imgCanny.CountNonzero()[0];

    //Compute a sharpness grade:
    //< 1.5 = blurred, in movement
    //de 1.5 à 6 = acceptable
    //> 6 =stable, sharp
    double dSharpness = (nCountCanny * 1000.0 / (imgCanny.Cols * imgCanny.Rows));
}
票数 25
EN

Stack Overflow用户

发布于 2015-03-26 10:52:00

感谢nikie对Laplace的好建议。OpenCV docs向我指出了同样的方向:使用python、cv2 (opencv 2.4.10)和numpy……

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))

结果介于0-255之间。我发现任何超过200ish的东西都是非常清晰的,而到了100时,它就会变得明显模糊。即使它是完全模糊的,最大值也不会真正低于20。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7765810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档