3行代码Python就可以识别图片的清晰度。原来我们看到的不一定是这个Clarity,缺乏统一的标准。但是有一些算法可以量化图片的清晰度,这样就有规律可循。原理如果之前了解过信号处理,就会知道最直接的方法就是计算图片的快速傅立叶变换,然后看高低频分布。如果一张图片有少量的高频成分,则可以认为图片是模糊的。但是高频量的具体阈值很难区分,不合适的阈值会导致结果极差。初学者有什么不懂的可以私信我——我刚刚整理了一套2021年最新的0基础入门教程,无私分享。获取方式:关注小编的CSDN,私信:【学习资料】即可获取,附:开发工具和安装包,以及系统学习路线图。我们期望的是一个能够代表画面清晰度的浮点数。Pech-Pacheco在2000年国际模式识别会议上提出,将图片中的某个通道(一般使用灰度值)通过拉普拉斯掩码进行卷积,然后计算标准差,得到的值可以表示图像的清晰度图片。这种方法起作用的原因在于拉普拉斯算子定义本身。它用于测量图像的二阶导数,突出显示图像中强度快速变化的区域,与Sobel和Scharr算子非常相似。并且,与上述算子一样,拉普拉斯算子也常用于边缘检测。此外,该算法基于这样的假设:如果图片具有高方差,则它具有宽频率响应,代表正常的、聚焦良好的图片。但是如果图片的方差很小,那么它的频率响应很窄,这意味着图片中的边缘数量很少。众所周知,图片越模糊,边缘就越少。有了代表清晰度的值,剩下的工作就是设置相应的阈值。如果某张图片的方差低于预定义的阈值,则可以认为该图片是模糊的。如果高于阈值,则不模糊。.实际操作原理好像比较复杂,涉及到很多信号和图像处理相关的知识,我们来实际操作一下,直观感受一下。因为人生苦短,而我个人是朋友圈Python吹牛第一人,所以选择用Python来实现,核心代码简单得令人发指:importcv2defgetImageVar(imgPath):image=cv2.imread(imgPath);img2gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)imageVar=cv2.Laplacian(img2gray,cv2.CV_64F).var()returnimageVar真的很短命,核心代码只有三行,简单说明一下。importcv2使用著名的图像处理库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就是拉普拉斯算子。原理部分提到,拉普拉斯算子经常用于边缘检测,所以这里的拉普拉斯算子之后,所有检测到的边缘都剩下了。上图经过这一步处理后是这样的:可以看到这里的图片中的字符总体上还是比较清晰的。cv2.Laplacian(img2gray,cv2.CV_64F).var()计算方差并在最后返回。上图是按照这个计算出来的3170多,这是我们最终判断清晰度的数值。所以想学习的同学,听听这位老师的课,领取python福利还是很有必要的。想学的同学可以去梦雅老师的微信(同读音):第一组是:mengy,后一组是:7762,把上面两组字母按顺序组合起来,她会安排学习.可以再找一张看看:原图:做灰度和拉普拉斯算子后,可以看到人物部分不是很清晰。最终计算出的方差只有530,剩下的工作就是根据整体图像质量来确定阈值。局限性通过以上实践,我们知道该算法的技巧在于设置了一个合适的阈值。阈值过低,正常图片会被误判为模糊图片,阈值过高,模糊图片会被误判为正常图片。阈值取决于您实际应用的业务场景,需要根据不同的使用场景进行定制。没有真正的灵丹妙药。除了需要设置一个阈值,有些图片可能会故意虚化背景或者虚化背景,很容易被误杀。例如:计算是这样的,后面一大片区域是黑色的。这张照片的前景其实看起来还可以,但是背景有很多虚化和虚化。这种情况下,更容易被误杀。所以最好在了解原理后根据实际场景使用。
