理论
Laplacian 梯度函数与Tenengrad梯度函数基本一致,用Laplacian算子替代Sobel算子即可,该算子定义如下:
因此基于Laplacian 梯度函数的图像星清晰度的定义如下:
其中是像素点处Laplacian算子的卷积。
https://blog.csdn.net/Real_Myth/article/details/50827940
代码
def Laplacian(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
return cv2.Laplacian(img,cv2.CV_64F).var()
https://blog.csdn.net/Greepex/article/details/90183018
def lapulase(dir,name):
"""
:param dir: 操作目录
:param name: 操作的文件名称
:return: 分数
"""
filePath=dir+name #
img = filePath
# Laplace梯度法
frame = cv2.imread(img)
#cv2.imshow("原始图", frame);
resImg = cv2.resize(frame, (800, 900),interpolation=cv2.INTER_CUBIC)
img2gray = cv2.cvtColor(resImg, cv2.COLOR_BGR2GRAY) # 将图片压缩为单通道的灰度图
#img_resize = cv2.resize(img2gray, (112, 112)) # 为方便与其他图片比较可以将图片resize到同一个大小
res = cv2.Laplacian(img2gray, cv2.CV_64F)
score = res.var()
font = cv2.FONT_HERSHEY_SIMPLEX
fontSize=5
# 照片 添加的文字 /左上角坐标 字体 字体大小 颜色 字体粗细
cv2.putText(resImg, str(score), (0, 200), font, fontSize, (0, 255, 0),6)
newDir=dir+"/_Laplace_/"
if not os.path.exists(newDir):
os.makedirs(newDir)
newName=newDir+name
cv2.imwrite(newName, resImg)
cv2.imshow('image', resImg)
cv2.waitKey(0)
#print("Laplacian score of given image is ", score)
#cv2.imshow(r"gray效果图", img2gray);
#cv2.imshow(r"laplace效果图", resImg);
return score
https://www.cnblogs.com/greentomlee/p/9379471.html
百度AIP中模糊度的计算方法:拉普拉斯方差算法(Variance of the Laplacian)
利用OpenCV和拉普拉斯算子来计算图片中的模糊量
只需要将图片中的某一通道(但一般用灰度值)用下面的拉普拉斯掩模做卷积运算:
用拉普拉斯算子与输入图像做卷积,然后计算方差(即标准差的平方)。
如果某图片方差低于预先定义的阈值,那么该图片就可以被认为是模糊的。高于阈值,就不是模糊的。
这种方法凑效的原因就在于拉普拉斯算子定义本身。它被用来测量图片的二阶导数,突出图片中强度快速变化的区域,和 Sobel 以及 Scharr 算子十分相似。并且,和以上算子一样,拉普拉斯算子也经常用于边缘检测。
此外,此算法基于以下假设:如果图片具有较高方差,那么它就有较广的频响范围,代表着正常,聚焦准确的图片。但是如果图片具有有较小方差,那么它就有较窄的频响范围,意味着图片中的边缘数量很少。正如我们所知道的,图片越模糊,其边缘就越少。
代码如下:
```
import cv2 imagePath =’./data/y1.jpg’ image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print(‘y1 blur:’,cv2.Laplacian(gray, cv2.CV_64F).var())
存在问题:
图像y1:
图像y2:
运行结果:图像y1的blur值更高,即程序判断y1更清晰
y1 blur: 1663.09841446
y2 blur: 924.740511
原因分析:
- 造成图片的模糊有2个原因,一种是目标快速移动,还一种是摄像机本身抖动
- 目前监控摄像头造成的迷糊原因是目标快速移动,而背景不动
- 拉普拉斯方差计算会使用拉普拉斯掩模对整张图做卷积运算,而背景不动的部分其实很清晰,只是移动的目标部分模糊罢了,这样整个模糊值就低了
https://gist.github.com/JuneoXIE/d595028586eec752f4352444fc062c44
def _lapulaseDetection(self, imgName):
"""
:param strdir: 文件所在的目录
:param name: 文件名称
:return: 检测模糊后的分数
"""
# step1: 预处理
img2gray, reImg = self.preImgOps(imgName)
# step2: laplacian算子 获取评分
resLap = cv2.Laplacian(img2gray, cv2.CV_64F)
score = resLap.var()
print("Laplacian %s score of given image is %s", str(score))
# strp3: 绘制图片并保存 不应该写在这里 抽象出来 这是共有的部分
newImg = self._drawImgFonts(reImg, str(score))
newDir = self.strDir + "/_lapulaseDetection_/"
if not os.path.exists(newDir):
os.makedirs(newDir)
newPath = newDir + imgName
# 显示
cv2.imwrite(newPath, newImg) # 保存图片
cv2.imshow(imgName, newImg)
cv2.waitKey(0)
# step3: 返回分数
return score
https://github.com/Leezhen2014/python—/blob/master/BlurDetection.py