计算图像的清晰度

ari*_*ies 4 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
??
Run Code Online (Sandbox Code Playgroud)

有人可以指导我吗?

Kor*_*nel 9

可能重复:有没有办法检测图像是否模糊?

所以你的重点措施是:

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

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

double focusMeasure = sigma.val[0] * sigma.val[0];
Run Code Online (Sandbox Code Playgroud)

编辑#1:

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

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

阅读文章

JL Pech-Pacheco,G.Cristobal,J.Chamorro-Martinez,J.Fernandez-Valdivia," Diatom autofocusing in Brightfield microscopy:a comparison study ",第15届国际模式识别大会,2000年.(卷:3)

欲获得更多信息.


小智 6

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

我目前正在编写一个脚本,使用mtcnn检测一张有人群的图片中的多张脸,效果很好,但是它也检测到许多脸,非常模糊,以至于你不能说这是一张脸。

示例图像:

原图

检测到的人脸:

检测到的人脸的红色方块

检测到的人脸矩阵:

11x11 矩阵面

mtcnn 检测到大约 123 张面孔,但其中许多与面孔几乎没有相似之处。事实上,许多脸看起来更像是一个污点而不是其他任何东西......

所以我正在寻找一种“过滤”那些模糊面孔的方法。我尝试了在这个答案中找到的拉普拉斯滤波器和 FFT 过滤方式,但是我得到了不一致的结果和糟糕的过滤结果。

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

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

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

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

def getBlurValue(image):
    canny = cv2.Canny(image, 50,250)
    return np.mean(canny)
Run Code Online (Sandbox Code Playgroud)

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

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

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

该值取决于图像和阈值,因此它不是适用于所有场景的通用解决方案,但是可以通过标准化结果和平均所有面部来获得最佳值(我需要在该主题上做更多工作)。

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

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

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

大多数模糊的脸都被过滤掉了

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

在此处输入图片说明

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

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