python视频清晰度增强,python图像清晰化处理
通常一张图片是否清晰是一个感性认识。对于同一张图,你可能觉得还可以,别人会觉得不清楚,缺乏统一的标准。但是有一些算法可以量化图片的清晰度,这样就有章可循了。
原则
如果你之前了解过信号处理,就会知道最直接的方法就是计算图片的快速傅立叶变换,然后看高低频分布。如果一张图片有少量的高频成分,可以认为是模糊的。但是区分高频的具体阈值是非常困难的,阈值选择不当会导致效果不佳。
我们期望的是单个浮点数就能代表画面的清晰程度。Pech-Pacheco在2000年的模式识别国际会议上提出,将一幅图片中的某个通道(通常是灰度值)通过一个平滑的刺猬掩模进行卷积,然后计算标准差,得到的值可以代表图片的清晰度。
这种方法之所以行得通,是因为刺猬算子本身的光滑定义。它用于测量图像的二阶导数,突出图像中强度变化快的区域,这与Sobel和Scharr算子非常相似。和上述算子一样,平滑刺猬算子也常用于边缘检测。此外,该算法基于以下假设:如果一幅图像具有高方差,则它具有宽的频率响应范围,这代表正常和聚焦的图像。但如果一张图片的方差很小,那么它的频率响应范围就很窄,这意味着图片中的边数非常少。我们知道,一张照片越模糊,它的边缘就越少。
有了代表锐度的值,剩下的工作就是设置相应的阈值。如果图片的方差低于预定阈值,则该图片可以被认为是模糊的。如果高于阈值,则不模糊。
实际操作
原理看起来很复杂,涉及很多信号和图像处理的知识。我们来实践一下,直观感受一下。
因为人生短暂,而且我个人是朋友圈第一个Python玩家,所以选择用Python来实现。核心代码简单得可怕:
导入cv2
def getImageVar(imgPath):
image=cv2 . im read(img path);
img2gray=cv2.cvtColor(image,cv2。COLOR_BGR2GRAY)
imageVar=cv2。拉普拉斯(img2gray,cv2。CV_64F)。风险值()
返回图像变量
复制代码
人生真的很短暂。核心代码只有三行。简单解释一下。
Import cv2使用知名的图像处理库OpenCV。关于OpenCV的安装,这里就不赘述了。需要注意的是,它依赖于numpy。
Image=cv2.imread(imgPath)使用OpenCV提供的方法读取图片。2 img gray=cv2.cvtcolor (image,cv2.color _ bgr2gray)转换为灰度图像。如下图:
原图是这样的:
2.CVLaplacian (img2gray,cv2。CV_64F)用33平滑hedgehog算子对图片进行卷积,其中CV2.cv _ 64f是平滑hedgehog算子。
原则上,平滑hedgehog算子经常用于边缘检测,所以在这里平滑hedgehog算子之后,所有检测到的边缘都留下了。完成这一步后,上图如下所示:
你可以看到这里的图片人物大体清晰。
2.cvlaplacian (img2gray,cv2.cv _ 64f)。var()计算方差并最终返回。
按此计算,上图是3170多,这是我们用来判断清晰度的最终值。
你可以再找一个:
原图:
做了灰度和平滑刺猬算子后,可以看到字符部分不是很清晰。
最后算出来的方差只有530。
剩下的工作就是根据整体画质来确定阈值。
限制
通过上面的实践,我们知道这个算法的诀窍就是设置一个合适的阈值。如果阈值太低,正常图像会被误断成模糊图像;如果阈值过高,模糊图像会被误判为正常图像。门槛取决于你的实际业务场景,需要根据不同的使用场景进行定制。
真正的银子弹是不存在的。除了设置阈值,有些图片可能会故意模糊或模糊背景,容易被误杀。
例如:
计算是这样的,后面一大片都是黑的。
这张图前景其实看起来还可以,但是背景有很大的模糊和虚化,更容易被误杀。
所以了解原理后最好根据实际场景来使用。
最后,编写一个简单的脚本来计算传入图像路径的图像,然后返回一个json字符串。
用法python getrank.py-imgs=。/1.jpg,/2.jpg
破碎的思想
记录一些思想和想法,写科技和人文,写生活状态,写读书经历,主要是废话和感悟。欢迎关注和交流。
微信:程序员的诗和远方
微信官方账号ID: MonkeyCoder-Life
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。