有了代表清晰度的值,剩下的工作就是设定相应的阀值,如果某图片方差低于预先定义的阈值,那么该图片就可以被认为是模糊的,高于阈值,就不是模糊的。
实操
原理看起来比较复杂,涉及到很多信号啊图片处理的相关知识,下面我们来实操一下,直观感受下。
由于人生苦短,以及我个人是朋友圈第一 Python 吹子,我选择使用 Python 来实现,核心代码简单到令人发指:
import cv2
def getImageVar(imgPath):
image = cv2.imread(imgPath);
img2gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
imageVar = cv2.Laplacian(img2gray, cv2.CV_64F).var()
return imageVar
真是人生苦短啊,核心代码就三行,简单解释下。
import cv2使用了一个著名的图像处理库 OpenCV,关于 OpenCV 的安装这里不多赘述,需要注意的是它依赖 numpy。
image = cv2.imread(imgPath)使用 OpenCV 提供的方法读取图片。img2gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)转化为灰度图。如下图:
原图是这样的:
cv2.Laplacian(img2gray, cv2.CV_64F)对图片用 3x3 拉普拉斯算子做卷积,这里的cv2.CV_64F就是拉普拉斯算子。
原理部分说过,拉普拉斯算子经常用于边缘检测