如何在Python中使用OpenCV执行模糊检测
在电晕的日子里(仍然没有结束),我每天会在我家附近走一个小时,然后回到家。有一天,当我再次出去散步时,我想到了手机上不必要的照片。来自大学Whatshap小组的数千张照片。我需要很长时间才能在其中找到不需要的照片。但是我有一个减轻这种工作量的想法。
模糊检测
我的画廊里可能有近万张照片。其中,我认为至少300-400张照片模糊(我的画廊中有378张模糊照片)。“我该如何处理?” 当我想到时,我想到我是一名软件工程师。我立即完成行走,回到家,坐在电脑前,做了一个名为“模糊检测”的小项目,下面将告诉您。
第1部分:逻辑
大约3个小时后,我编写了117行代码,该算法无法正常运行。意识到他不能那样处理,我开始思考。我想到了大约3年前的课程中提到的一个主题:“拉普拉斯过滤器”。
模糊检测
拉普拉斯滤镜主要用于定义图片中的边缘线。边缘在这里是指通常将对象与背景分开的锐利分色。拉普拉斯滤镜(也称为锐化滤镜)在操作时使用一个窗口。您可以通过下面的简短视频更好地了解活动。
例如,下面是一个3×3(3 * 3)窗口以及每个单元格中可在此过程中使用的系数值:
1 1 1 1 -8 1 1 1 1
在上面的该窗口中,每个单元中的像素值仅乘以该单元中的系数,然后将结果添加到中间的像素的新值。
例如,考虑一个矩阵,其当前值如下所示:
4 5 6 3 3 8 2 1 7
该矩阵中间的新值由以下公式计算:
1 x 4 +1 x 5 +1 x 6 +1 x 3 + -8 x 3 +1 x 8 +1 x 2 +1 x 1 + 1 x 7 = 12
过滤后的矩阵:
4 5 6 3 12 8 2 1 7
发现为。以下是应用了拉普拉斯滤镜的普通图片:
模糊检测
图片发布
第2部分:申请
首先,让我们导入必要的库。
导入cv2
导入argparse
导入球
我们打开一个名为“ images”的文件夹,其中包含足够的照片。相片:
图片发布
现在让我们回到编码。让我们使用“ argparse”软件包进行必要的调整。
ap = argparse.ArgumentParser()
ap.add_argument('-i','--images',required = True,)
ap.add_argument('-t','--threshold',type = float)
args = vars(ap.parse_args())
为了将文件夹中的图像保留在单个数组中,我们编写以下代码:
images = [cv2.imread(file)for glob.glob(“ {} / *。jpeg” .format(args ['images']))中的文件]]
现在是时候一张一张地拍摄文件夹中的图片,然后应用拉普拉斯方法找到模糊了。
用于图像中的图像:
灰色= cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY)
fm = cv2.Laplacian(灰色,cv2.CV_64F).var()
文字=“不模糊”
如果fm <args [“阈值”]:
文字=“模糊”
cv2.putText(image,“ {}:{:.2f}”。format(text,fm),(10,30),
cv2.FONT_HERSHEY_SIMPLEX,0.8,(0,0,255),3)
cv2.imshow(“图像”,图像)
cv2.waitKey(0)
1.line:我们开始循环播放,以逐一旋转文件夹中的照片。
2.line:我们将照片变成灰度。
3.line:我们使用拉普拉斯方法。结果,将返回浮点类型编号。(例如4.312563或764.471094)
6.line:我们将第3行的结果与我们确定的阈值进行比较。如果结果低于阈值,我们将其视为“模糊”。通常,阈值在100时给出非常好的结果。
在控制台屏幕上键入以下内容以使其运行
python blur_detection.py -i图片-t 100
它完成了。我们使用OpenCV做了一个小项目来进行模糊检测。
题库