模糊检测,简单理解

opencv中的模糊检测

设定好的摄像头若是无意中被移动或是失去焦距而变得视像模糊,若没有人工发现,对后续的图像和视频操作精度影响很大。所以首先检测视频中图像的模糊程度是有必要的。

话不多说,先讲结论。opencv中我目前所知检测图片质量或是模糊程度的方法原理是:检测图片中清晰的边缘数量。清晰的图像中一般来说能显示出各个物体的清晰边缘线条,模糊图像中的边缘占据的像素较多,所以模糊,此为判断前提。一般场景中的物体较多,边缘数量也较多,这种情况下的模糊和清晰很容易判断。二般场景中的物体很少,场景单纯,边缘数量天然就少,清晰度计算结果会很小,但不能说明图片不清晰,只能说明图中边缘信息少。本博客仅对一般场景有效,二般场景另说。

实现过程:

(1)多通道图片转为灰度图像。

img2gray = cv2.cvtColor(resImg, cv2.COLOR_BGR2GRAY)

(2)变换提取线条

方法(一):laplacian梯度函数

res = cv2.Laplacian(img2gray, cv2.CV_64F)

灰度图进行laplacian变换,求得laplacian梯度结果图。laplacian算子如图,梯度计算如图,梯度计算的方式就是用算子做卷积。

得到边缘图像如效果图(左边为清晰原图计算结果,右边为模糊图的计算结果)。

score = res.var()

梯度计算完后,得到如上矩阵。之后便是计算矩阵元素方差。方差即为清晰度计算的结果。方差计算结果越大原图越清晰。方差值与对应原图如下图。L for laplacian ,B for Brenner。

方法(二)Tenengrad梯度函数

res = cv2.Sobel(img2gray,cv2.CV_64F,1,1)

与laplacian算子不同,这里是使用sobel算子,sobel算子仅对横、纵边缘敏感,laplacian对斜的也敏感。如图。

laplacian是计算二阶微分,这里是一阶微分。过程同样是卷积。结果如下图。

mean=res.mean()

得到如上矩阵,计算矩阵元素均值。用均值表示清晰度。结果如下图。S for sobel

方法(三)Brenner 检测

遍历灰度图,计算像素与相邻像素的差值平方和。原理如公式图。

计算值就是上面图中的B的值

 

(3)更多效果图

二般场景如下。

(4)总结

经laplacian变换或是sobel算子变换后能得到边缘图像,计算方差或均值得到清晰度指标,原理就是计算图片中边缘数量,模糊图像相较于清晰图像的均值和方差均有显著下降。

原本图像中的边缘较少,检测值自然也小,并不能说明图片不清晰啊。。。。但是模糊图相对与清晰原图的检测值相较有着明显的下降,可以对比原来清晰的图判断图像是否糊了。

时间有限,记录的自己能看懂就好。

评论指教、交流。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值