【问题标题】:Calculating sharpness of an image计算图像的清晰度
【发布时间】:2015-04-27 07:56:23
【问题描述】:

我在互联网上发现拉普拉斯方法是计算图像清晰度的非常好的技术。我试图在 opencv 2.4.10 中实现它。应用拉普拉斯函数后如何获得锐度度量?下面是代码:

Mat src_gray, dst;
int kernel_size = 3;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;

GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

/// Convert the image to grayscale
cvtColor( src, src_gray, CV_RGB2GRAY );

/// Apply Laplace function
Mat abs_dst;

Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );

//compute sharpness
??

有人可以指导我吗?

【问题讨论】:

标签: opencv image-processing


【解决方案1】:

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

所以你的注意力衡量标准是:

cv::Laplacian(src_gray, dst, CV_64F);

cv::Scalar mu, sigma;
cv::meanStdDev(dst, mu, sigma);

double focusMeasure = sigma.val[0] * sigma.val[0];

编辑#1

好的,因此对焦良好的图像应具有更清晰的边缘,因此使用图像渐变有助于确定可靠的对焦测量值。给定图像梯度,焦点度量必须将每个点的数据合并为唯一值。

二阶导数的使用是一种传递与锐利边缘相关的高空间频率的技术。作为二阶导数算子,我们使用拉普拉斯算子,它可以使用掩码进行近似:

为了在每个点汇集数据,我们使用两种方法。第一个是所有绝对值的总和,驱动到以下焦点度量:

其中L(m, n) 是输入图像I(m, n) 与掩码L 的卷积。第二种方法计算绝对值的方差,提供了一个新的焦点度量:

其中L overline 是绝对值的平均值。

阅读文章

J.L. Pech-Pacheco, G. Cristobal, J. Chamorro-Martinez, J. Fernandez-Valdivia,“明场显微镜中的硅藻自动对焦:a 比较研究”,第十五届国际模式会议 识别,2000。(卷:3)

了解更多信息。

【讨论】:

  • 我找到了这个,但不确定是否是这样。关于为什么焦点测量是标准偏差的两倍的任何想法?
  • 如果你想要一个清晰度图,即每个像素的清晰度级别。
  • @aries 他正在计算图像的方差和方差 = standardDeviation^2
【解决方案2】:

这篇文章帮助我在我的框架中进行模糊、锐化、浮雕、边缘检测。 Kernal Image Processing

我在 android 应用程序中使用了上述帮助。完成后,我将发布应用程序的链接和源代码。

希望这会有所帮助。 快乐编码:)

【讨论】:

  • 你完成了模糊部分吗?我想在没有opencv的情况下检测android中的模糊图像。
【解决方案3】:

不完全是答案,但我使用一种适用于野外的直观方法得到了一个公式。

我目前正在编写一个脚本,以使用 mtcnn 检测一张有人群的照片中的多张面孔,它工作得很好,但是它也检测到许多面孔如此模糊以至于你不能说它是正确的一张脸。

示例图片:

检测到人脸:

检测到的人脸矩阵:

mtcnn 检测到大约 123 张面孔,但其中许多与面孔几乎没有相似之处。事实上,许多面孔看起来更像是污点……

所以我正在寻找一种“过滤”那些模糊面孔的方法。我尝试了在 this answer 上找到的拉普拉斯滤波器和 FFT 过滤方式,但结果不一致且过滤结果不佳。

我将研究转向计算机视觉主题,最后尝试使用以下原理实现一种“直观”的过滤方式:

当图像更模糊时,我们拥有的“边缘”越少

如果我们将清晰的图像与同一图像的模糊版本进行比较,结果往往会“柔化”任何边缘或相邻的对比区域。基于该原则,我正在寻找一种加权边缘的方法,然后是一种简单的方法来“测量”结果以获得置信度值。

我利用 OpenCV 中的 Canny 检测,然后应用结果的平均值(Python):

def getBlurValue(image):
    canny = cv2.Canny(image, 50,250)
    return np.mean(canny)

Canny 返回 2x2 数组相同的图像大小。我选择了阈值 50,250,但可以根据您的图像和场景进行更改。

然后我得到了精明结果的平均值,(如果你知道自己在做什么,绝对是一个需要改进的公式)。

当图像模糊时,结果会得到一个趋向于零的值,而清晰的图像往往是一个正值,当图像更清晰时更高。

这个值取决于图像和阈值,因此它不是适用于所有场景的通用解决方案,但是可以实现对结果进行归一化并平均所有人脸的最佳值(我需要在该主题上做更多工作)。

在示例中,值的范围是 0-27。

我平均了所有的脸,得到了大约 3.7 的模糊值

如果我过滤高于 3.7 的图像:

所以我一直保持着最清脆的面孔:

这始终给我比其他测试更好的结果。

好的,你找到我了。这是在同一图像空间内检测模糊值的一种棘手方法。但我希望人们可以利用这一发现并将我学到的知识应用到自己的项目中。

【讨论】:

  • 啊,检测边缘。非常聪明!
  • 很有创意的方法,谢谢分享
  • 这不仅比许多其他答案工作得更好,而且速度快 10 倍以上。感谢分享!
  • canny 边缘检测器在这种情况下可以很好地工作,因为在这个例子中人脸比模糊人脸大。在这个例子中,人脸的分辨率是否标准化?锐利的人脸在前面,由于视角更大,比模糊的人脸有更多的像素,我可以想象这样可以更容易地分离人脸。
  • 分辨率面未标准化。这是将算法应用于整体图像的一种通用方式。
猜你喜欢
  • 2012-12-07
  • 2013-07-27
  • 2013-06-04
  • 2013-12-22
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多