【光电智造】算法|OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测
今日光电
翻译自【OpenCV Fast Fourier Transform (FFT) for blur detection in images and video streams】,原文链接:
本文仅作学习分享。
(相关资料图)
原始模糊检测方法:
模糊检测,顾名思义,是检测图像是否模糊的算法。
模糊检测可能的应用包括:
图像质量的自动分级
帮助专业摄影师在100到1000张的照片拍摄过程中自动丢弃模糊/低质量的照片
将OCR应用于实时视频流,但仅对非模糊帧应用昂贵的OCR计算
这里的关键要点是,为在理想条件下捕获的图像编写计算机视觉代码总是比较容易的。
与其尝试处理质量非常差的图像的边缘情况,不如检测并丢弃质量差的图像(比如有明显模糊的图像)。
这种模糊检测程序既可以自动丢弃质量差的图像,也可以简单地告诉终端用户:”嘿,老兄,再试一次,让我们在这里捕捉一个更好的画面”。
请记住,计算机视觉应用程序应该是智能的,因此有了“人工智能”这个术语——有时候,“智能”可以只是检测输入数据的质量是否太差,而不是试图弄懂它。
什么是快速傅立叶变换(FFT)?
快速傅里叶变换是计算离散傅里叶变换的一种方便的数学算法。它用于将信号从一个域转换为另一个域。
首先使用本教程的“下载”部分下载源代码和示例图像。一旦你解压缩文件,你将有一个目录组织如下:
我们的模糊检测器实现需要matplotlib和NumPy。我们将使用内建在NumPy中的快速傅里叶变换算法作为我们方法的基础;
第4行定义detect_blur_fft函数,接受四个参数:
图片image:我们对模糊检测输入图像
大小size:以图像中心点为中心的半径的大小,我们将使FFT偏移为零
阈值thresh:用于确定图像是否被认为是模糊的,将与震级的平均值(稍后详细说明)进行比较的一个值
标识符vis:一个布尔值,指示是否使用matplotlib可视化/绘制原始输入图像和大小图像
给定输入图像,首先获取它的尺寸(第7行)并计算中心(x, y)坐标(第8行)。
接下来,我们将使用NumPy的快速傅里叶变换(FFT)算法实现来计算离散傅里叶变换(DFT):
现在我们的detect_blur_fft 辅助函数已经实现,让我们通过创建一个Python驱动程序脚本来使用它,该脚本从磁盘加载一个输入图像,然后对其应用FFT模糊检测。
第2-6行进行导入,特别的是,我们需要导入我们在上一节中实现的detect_blur_fft函数。
从这里,我们解析四个命令行参数:
--image:用于模糊检测的输入图像的路径。
--thresh:我们的模糊检测器计算阈值。
--vis:我们的标志符,指示是否将输入图像的幅度值图像可视化。
--test:为了测试,我们可以逐步模糊输入图像,并对每个示例进行基于fft的模糊检测;此标志指示我们是否将执行此测试。
--image、--thresh和--vis参数分别对应于我们在上一节实现的detect_blur_fft函数的image、thresh和vis参数。
让我们继续,加载我们的输入图像,执行快速傅里叶变换模糊检测:
这里你可以看到我在锡安国家公园的地铁徒步旅行的输入图像-图像被正确地标记为不模糊。
让我们试试另一张图片,这是我家的狗,Jemma:
这幅图像有明显的模糊,因此被标记为模糊。
在这里,您可以看到我们的图像很快变得模糊和不可读,正如输出所示,我们的OpenCV FFT模糊检测器正确地将这些图像标记为模糊。
下面是一个可视化的快速傅里叶变换幅度值,图像变得越来越模糊:
----与智者为伍为创新赋能----
联系邮箱:uestcwxd@126.com
QQ:493826566
关键词: