【问题标题】:calculate blurness and sharpness of an image [duplicate]计算图像的模糊度和清晰度
【发布时间】:2012-12-07 15:34:05
【问题描述】:

可能重复:
Is there a way to detect if an image is blurry?

如何使用opencv计算给定图像的模糊度和清晰度? opencv 中是否有任何功能可以做到这一点?如果opencv中没有函数我该如何实现它?没有想法会很棒..

输入将是图像,输出应该是图像的模糊度和清晰度。

【问题讨论】:

  • 你是指模糊图像和锐化图像吗?
  • 见:docs.opencv.org/modules/imgproc/doc/filtering.html 当然你可以实现自己的,你需要一点图像处理的背景知识,你可以使用卷积例如:beej.us/blog/data/convolution-image-processing
  • @MarounMaroun 他想以某种方式检测和测量模糊,他不是在寻找应用模糊的方法。顺便说一句,我认为这个请求没有任何意义,我无法想象为什么这应该有效或有用。
  • 我误解了这个问题。对不起,我的错。
  • 你对这两个概念有定义吗?如果没有“完美”的参考图片,我无法想象“模糊”会有多大意义。

标签: c++ image-processing opencv computer-vision


【解决方案1】:

我不知道opencv。

如果我试图大致测量图像在从锐利到模糊的光谱中的位置,我会从观察图像的某些部分的锐度从相邻像素之间的对比度明显看出的观察开始 -类似于max(c1 * abs(r1 - r2), c2 * abs(g1 - g2), c3 * abs(b1 - b2)),其中 c1-3 衡量每个红色、绿色和蓝色通道的感知重要性,两个像素是 (r1,g1,b1) 和 (r2,g2,b2))。

可以进行许多调整,例如提高每种颜色对功率的贡献,以强调亮度刻度的暗端(功率 1)的变化。请注意,max() 方法会分别考虑每个颜色通道的清晰度:尽管只有一个通道发生变化,但从 (255,255,255) 到 (0,255,255) 的变化非常显着。

您可能会发现从 RBG 转换为另一种颜色表示形式会更好,例如色相/饱和度/值(网上会有很多网站解释 HSV 空间和转换公式)。

在摄影方面,我们通常想知道图像的对焦部分是否清晰(由于景深较浅而导致的前景/背景模糊/散景是正常且经常需要的质量) - 最清晰的指示在图像的某些部分中是高对比度,这表明您想要相邻像素对比度的最大值。也就是说,一些聚焦的图像仍然可以具有非常低的局部对比度(例如纯色表面的图片)。此外,传感器上损坏的像素元件、镜头/传感器上的污垢以及高 ISO/长时间曝光噪声都可能表现为对比度极高的斑点。因此,您的结果的有效性总是会受到质疑,但在一定比例的时间里,它可能是正确的。

【讨论】:

    【解决方案2】:

    我建议您经常对图像进行分析。高波段的能量会告诉你图像非常清晰,而低波段的能量通常意味着图像模糊。计算频谱,可以使用 FFTW 库。

    问候,

    【讨论】:

    • 感谢您的回复。此链接中有一个代码 sn-p stackoverflow.com/questions/7765810/… 一个名为 GetSharpness 的函数。它是否计算图像的清晰度?你的cmets在上面吗?
    • 是的!而已。这些卷积是图像的清晰度度量。另一个简单的选择是使用高斯滤波器或拉普拉斯算子模糊图像,然后计算结果与原始图像之间的差异。如果差值 >> 0 表示原始图像已经模糊!否则图像被锐化。计算机视觉是这样的......有两千种方法可以做同样的事情......好吧,根本不一样:-)