一、场景需求解读
现实场景中,我们经常会使用不同的设备区拍摄一些照片,常用的一些设备包括手机、相机等,但是在拍摄的过程中可能会受到一些因素的影响,最终导致拍摄出来的照片比较模糊。对于这些图片而言,我们经常利用人眼进行观察,这样比较费时费力,本文针对这个问题提出了一种全自动的方法来检测模糊的图片,这样可以极大的节约用户的时间。下图展示了一个案例,其中包含几张模糊的图片和清晰的图片。
二、模糊图片检测方案简介
方案一:
- 首先对输入的图片进行快速傅里叶变换操作;
- 然后检测图片中高频分量和低频分量的分布情况;
- 接着根据图片中包含的高频分量的多少进行合适的判断,如果图片中含有较少的高频分量,则表明该图片是模糊图片,否则是清晰图片。
方案二: 根据该文章的思路来进行检测。即根据Laplacian变换的方差值进行判断。
通过对比这两个方案,我们可以发现方案二更快、更方便。
三、模糊图片检测原理简介
整个算法的原理和拉普拉斯算子本身的定义有关,该算子主要用来测量图像的二阶导数。它强调了包含快速强度变化的图像区域。拉普拉斯算子经常被用来做边缘检测。这里存在着一个假设,即如果一个图像中包含着高方差,那么在图像中会有较大范围的响应,包括边缘和非边缘,这代表着一张正常图像。但是如果该图像的方差很低,那么响应的范围很小,这表明图像中的边缘很小。众所周知的是当图像越模糊时,包含的边缘信息就会越少。
四、算法实现步骤
步骤1-读取输入图片;
步骤2-输入图片灰度化;
步骤3-与特定的Laplacian核进行卷积;
步骤4-计算响应的方差值;
步骤5-如果当前的方差值<threshold,则该图片为模糊图片,否则不是模糊图片。
五、算法代码实现
# coding=utf-8
# 导入相应的python包
from imutils import paths
import argparse
import cv2
def variance_of_laplacian(image):
'''
计算图像的laplacian响应的方差值
'''
return cv2.Laplacian(image, cv2.CV_64F).var()
if __name__ == '__main__':
# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True, help="设置输入图片的路径")
ap.add_argument("-t", "--threshold", type=float, default=100.0, help="设置模糊阈值")
args = vars(ap.parse_args())
# 遍历每一张图片
for imagePath in paths.list_images(args["images"]):
# 读取图片
image = cv2.imread(imagePath)
# 将图片转换为灰度图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算灰度图片的方差
fm = variance_of_laplacian(gray)
text = "Not Blurry"
# 设置输出的文字
if fm < args["threshold"]:
text = "Blurry"
# 显示结果
cv2.putText(image, "{}: {:.2f}".format(text, fm), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
cv2.imshow("Image", image)
key = cv2.waitKey(0)
运行方法:python detece_blur_imgae.py -i 图片路径 (这里的图片路径需要修改成你自己的路径)
六、算法效果展示与分析
上图展示了该算法的检测结果,通过观察上图我们可以获得一些信息,即该算法能够准确的检测出模糊图片,并在图片的左上角区域内输出结果并展示相应的方差值。尽管该算法的思路和实现都比较简单,但是它简单高效。
参考资料
[1] 参考链接
注意事项
[1] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:[email protected]),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注公众号AI产品汇之后找我索取!
[6] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!