计算图像的清晰度

Calculating sharpness of an image

我在网上发现拉普拉斯算子法是计算图像清晰度的一种很好的技术。我试图在 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
??

有人可以指导我吗?

可能重复: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 上划线是绝对值的平均值。

阅读文章

J.L. Pech-Pacheco, G. Cristobal, J. Chamorro-Martinez, J. Fernandez-Valdivia, "Diatom autofocusing in brightfield microscopy: a comparative study", 15th International Conference on Pattern Recognition, 2000. (Volume:3 )

了解更多信息。

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

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

希望这对您有所帮助。 编码愉快:)

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

我目前正在编写一个脚本,使用 mtcnn 来检测人群照片中的多张面孔,效果非常好,但是它也检测到许多面孔非常模糊,以至于您无法检测到说它是一张脸。

示例图片:

检测到的面孔:

检测到的人脸矩阵:

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

所以我正在寻找 'filtering' 那些模糊面孔的方法。我尝试了在 this answer 上找到的 Laplacian 滤波器和 FFT 滤波方式,但是结果不一致且滤波结果不佳。

我将我的研究转向计算机视觉主题,并最终尝试使用以下原理实现一种 'intuitive' 过滤方式:

When more blurry is an image, less 'edges' we have

如果我们将清晰图像与同一图像的模糊版本进行比较,结果往往 'soften' 任何边缘或相邻的对比区域。基于这一原则,我找到了一种对边缘进行加权的方法,然后是一种 'measuring' 结果获得置信度值的简单方法。

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

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

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

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

当图像模糊时,结果将得到一个趋于零的值,而清晰的图像趋向于正值,图像越清晰则越高。

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

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

我对所有面孔进行平均,得到大约 3.7 的模糊值

如果我过滤 3.7 以上的图像:

所以我保持着最清爽的面孔:

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

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