用 Opencv 和 Python 对狗狗做模糊检测
Jemma,一只超级甜美,极其活泼可爱的家养米格鲁猎犬,可能是家里有史以来照片最多的狗狗了。从我在她八周大的时候遇到她开始,三年以来,我已经累积了6000 多张她的照片。
过度了吧?
或许是吧。但是我喜欢狗狗。非常喜欢。尤其是米格鲁猎犬。所以应该不足为奇,作为狗狗主人的我,会花很多时间用 Jemma 最喜欢的玩具和她玩拔河游戏,或者和她在厨房地板上滚来滚去相互打闹。当然,我会用我的 iphone 拍摄大量她的照片。
在刚刚过去的这个周末,我坐下来想在 iphoto 中整理这些海量的照片。这不仅仅意味着巨大的工作量,因为我很快注意到一个现象——其中充斥着大量模糊的照片。
主要因为我的摄影技术比较low,Jemma又特别活泼,跑来跑去,有时候看到我拍照,它又吓得缩起来发抖,所以我抓拍的效果不是很好,导致有多照片都是模糊的
作为一个普通人,我可能会想软件设计者们会开发出新功能来检测出这些模糊的照片(或者至少把他们移到一个单独的文件夹)。但是作为一个计算机视觉科学家,我是不会这样想的。
相反,我打开编辑器很快就编写了一个 Python 脚本,用 OpenCV 来执行模糊检测。
在这篇文章剩下的部分里,我将会展示如何用 OpenCV、Python 和拉普拉斯算子来计算图片中的模糊量。到文章结束,读者就能应用拉普拉斯方差算法来检测图片中的模糊量。
拉普拉斯方差算法(Variance of the Laplacian)
图1,用拉普拉斯算子与输入图像做卷积
我检测图片模糊量的第一步就是去拜读这篇优秀的综述文献——《Analysis of focus measure operators for shape-from-focus》[2013 Pertuz et al.]。在这篇文献中,Pertuz 等人论述了近 36 种不同的图片清晰度评价(focus measure)方法。
如果读者了解信号处理,就会知道最直接的方法就是计算图片的快速傅里叶变换,然后查看高低频的分布。如果图片有少量的高频成分,那么该图片就可以被认为是模糊的。然而,区分高频量多少的具体阈值却是十分困难的,不恰当的阈值将会导致极差的结果。
相反,如果我们能用计算出的一个具体浮点数值来表征图片的模糊程度,岂不是十分优雅?
Pertuz 等人讨论了很多种方法来计算“模糊度”。其中的一些方法简单明了,仅仅使用了像素灰度值的统计数据,其他的一些相比更加先进并且是基于特征的,使用了局部二值模式。
在快速浏览论文之后,我开始着手实现我找到的拉普拉斯方差算法——出自 Pech-Pacheco 等人 2000 年模式识别国际会议论文:《Diatom autofocusing in brightfield microscopy: a comparative study》
这种方法简洁明了,论证翔实,并且可以通过仅仅一行代码来实现:
更多相关文章
- 解决SimpleCV的Hello World程序无法显示照片
- Android——Tomcat版本更新下载+头像照片上传到Tomcat
- 跟随屏幕大小自动调整bitmap大小(横竖屏拍摄的照片均可)
- Android开发 处理拍照完成后的照片角度
- Android开源代码解读の地图照片应用Panoramio的实现详解(六)
- Unity Android使用相机拍摄照片并在其上增加一个3D对象