计算图像的清晰度

时间:2015-02-25 10:50:06

标签: opencv image-processing

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

有人可以指导我吗?

3 个答案:

答案 0 :(得分:7)

可能重复: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

好的,因此聚焦良好的图像预计会有更清晰的边缘,因此使用图像渐变有助于确定可靠的聚焦测量。给定图像渐变,焦点测量必须将每个点的数据汇集为唯一值。

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

enter image description here

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

enter image description here

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

enter image description here

其中L上线是绝对值的平均值。

阅读文章

  

J.L。 Pech-Pacheco,G。Cristobal,J。Chamorro-Martinez,J。   Fernandez-Valdivia," 硅藻在明场显微镜中的自动聚焦:a   比较研究",第15届国际模式会议   承认,2000年。(卷:3)

了解更多信息。

答案 1 :(得分:4)

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

我目前正在编写一个脚本,使用 mtcnn 检测一张有人群的图片中的多张脸,效果很好,但是它也检测到了很多模糊的脸,你说不出来本来就是一张脸。

示例图片:

Original image

检测到的人脸:

red squares for detected faces

检测到的人脸矩阵:

11x11 matrix faces

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 以上的图片:

most blurred faces are filtered

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

enter image description here

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

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

答案 2 :(得分:0)

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

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

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