很多应用场景会对图片的质量有要求,因相机抖动或者物体处于运动时容易造成图片模糊。

java openvc图片清晰度判断 opencv图片清晰度检测_OpenCV

那么模糊的照片怎么去衡量呢?根据参考大量的方案-对图像进行梯度求解然后求方差,以方差的值作为评价图像的清晰程度。

最为常用的或者说最为经典的是拉普拉斯算子进行的梯度计算。

图像-》灰度-》拉普拉斯-》方差。

import cv2
imagePath ='./ai_hellohello.jpg'
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
result = cv2.Laplacian(gray, cv2.CV_64F).var()
print('ai_hellohello.jpg blur:',result )

通过以上代码可以计算得到一个值,可能是几百可能是几千,模糊的就是几十。

但有个问题比较值得深思的时候,阈值怎么设置来区分?

同样的尺寸,不同的清晰度直接比较还是会出现一定的区分度。

但是不同尺寸的比较就不能用一个阈值来设置了。

对于人脸识别中,对人脸的清晰度的检测就是会遇到这个问题。

一个像素尺寸比较大的模糊人脸在进行resize到一个小的尺寸的时候,拉普拉斯方差值同样是会提升的,而且有可能提升很多倍。

 

也就是,让我们比较两个不一样高的人,看看谁更重,看身材还是大致准确的评估出来,

但是 俩个身高不高的人,仅仅看身材是无法评估出来的。

 

所以,我建议是自己分析图片尺寸的区间划分出来,对每个区间去做分析,在每个区间上设置一个合适的阈值来对图片进行模糊和清晰度的评判。

当然,更为有效的方式就是神经网络CNN去训练,如果对人脸的分析 那就要先检测图像中的人脸区域再去做判断。

不要拿一个包含背景的图片整图去分析。