使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
写在前面
- 工作中遇到,简单整理
- 人脸识别中,对于模糊程度较高的图像数据,识别率低,错误率高。
- 虽然使用
AdaFace
模型,对低质量人脸
表现尤为突出。 - 但是还是需要对 模糊程度高的图像进行丢弃处理
- 当前通过
阈值分类
,符合要求的进行特性提取 - 实际应用中,可以维护一个
质量分数
- 比如由
模糊程度
,图片字节大小
,人脸姿态评估(欧拉角)
等 算出一个综合质量分,用于人脸归类/聚类 - 理解不足小伙伴帮忙指正
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
模糊度检测算法来自 :https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/
具体实现方式小伙伴可直接看原文
这种方法起作用的原因是由于
拉普拉斯算子
本身的定义,它用于测量图像的二阶导数。拉普拉斯突出显示包含快速强度变化的图像区域,与 Sobel 和 Scharr 算子非常相似。而且,就像这些运算符一样,拉普拉斯通常用于边缘检测
。这里的假设是,如果图像包含高方差,则存在广泛的响应,包括边缘类和非边缘类,代表正常的焦点图像。但是,如果方差非常低,则响应的分布很小,表明图像中的边缘非常小
。众所周知,图像越模糊,边缘就越少
下面为原文的 Demo
1 | #!/usr/bin/env python |
核心代码:
1 | cv2.Laplacian(gray, cv2.CV_64F).var() |
如果为 Image.image
,可以使用下的方式
1 | def variance_of_laplacian(image): |
实际测试中发现,阈值设置为 100 相对来说比较合适,当然如何数据集很大,可以考虑 提高阈值,当模糊度大于 1000 时,一般为较清晰图片,低于 100 时,图片模糊严重
下面为对一组较模糊数据进行检测
最后一个图像,模糊度为 667 ,其他为 200 以内
1 | (AdaFace) C:\Users\liruilong\Documents\GitHub\AdaFace_demo>python detect_blur.py |
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 :)
https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/
© 2018-至今 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)
https://liruilongs.github.io/2023/07/24/AI-人脸识别/使用-OpenCV-进行图像模糊度检测-拉普拉斯方差方法/