本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。
原文链接:OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测
关于模糊检测,也可以参考OpenCV与AI深度学习 | 实用技巧 | 使用OpenCV进行模糊检测_opencv ai-优快云博客。
翻译自【OpenCV Fast Fourier Transform (FFT) for blur detection in images and video streams】,原文链接:
https://www.pyimagesearch.com/2020/06/15/opencv-fast-fourier-transform-fft-for-blur-detection-in-images-and-video-streams/
在本教程中,您将学习如何使用OpenCV和快速傅里叶变换(FFT)在图像和实时视流中执行模糊检测。
今天的教程是我上一篇关于OpenCV模糊检测的博客文章的扩展
(https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/)。
原始模糊检测方法:
-
依赖于计算图像Laplacian算子的方差
-
可以仅用一行代码实现
-
使用起来非常简单
缺点是,Laplacian方法需要大量手动调整用于定义图像是否模糊的”阈值“。如果你能控制你的光线条件,环境和图像捕捉过程,这个方法工作得很好,但如果不是,那你很可能得到杂乱不堪的效果。
我们今天要讲的方法依赖于计算图像的快速傅里叶变换。它仍然需要一些手动调整,但正如我们将发现的,FFT模糊检测器比Laplacian方差更加可靠与稳定。
在本教程结束时,你将拥有一个可以应用于图像和视频流,且功能齐全的FFT模糊检测器。
OpenCV快速傅里叶变换(FFT)模糊检测
在本教程的第一部分,我们将简要讨论:
-
什么是模糊检测
-
为什么我们想检测图像/视频流中的模糊
-
快速傅里叶变换如何让我们检测模糊
什么是模糊检测,什么时候我们需要检测模糊?
图1:如何使用OpenCV和快速傅里叶变换(FFT)算法自动检测照片是否模糊?(图片来源:https://www.cs.unm.edu/~brayer/vision/fourier.html)
模糊检测,顾名思义,是检测图像是否模糊的算法。
模糊检测可能的应用包括:
-
图像质量的自动分级
-
帮助专业摄影师在100到1000张的照片拍摄过程中自动丢弃模糊/低质量的照片
-
将OCR应用于实时视频流,但仅对非模糊帧应用昂贵的OCR计算
这里的关键要点是,为在理想条件下捕获的图像编写计算机视觉代码总是比较容易的。
与其尝试处理质量非常差的图像的边缘情况,不如检测并丢弃质量差的图像(比如有明显模糊的图像)。
这种模糊检测程序既可以自动丢弃质量差的图像,也可以简单地告诉终端用户:”嘿,老兄,再试一次,让我们在这里捕捉一个更好的画面”。
请记住,计算机视觉应用程序应该是智能的,因此有了“人工智能”这个术语——有时候,“智能”可以只是检测输入数据的质量是否太差,而不是试图弄懂它。
什么是快速傅立叶变换(FFT)?
图2:在本教程中,我们将使用OpenCV和NumPy的组合在图像和视流中进行基于快速傅立叶变换(FFT)的模糊检测。
快速傅里叶变换是计算离散傅里叶变换的一种方便的数学算法。它用于将信号从一个域转换为另一个域。
FFT在许多学科中都很有用,包括音乐、数学、科学和工程。例如,电气工程师,特别是那些与无线、电源和音频信号打交道的工程师,需要FFT计算来将时间序列信号转换到频域,因为有些计算在频域更容易进行。相反,使用FFT可以将频域信号转换回时域。
在计算机视觉方面,我们通常认为FFT是一种图像处理工具,它可以将图片在两个图像域内转换:
-
傅里叶(即频率)域
-
空间域
此外,FFT同时用实分量和虚分量来表示图像。
通过分析这些值,我们可以执行图像处理程序,如模糊,边缘检测,阈值,纹理分析,以及模糊检测。
回顾快速傅里叶变换的数学细节超出了这篇博客文章的范围,所以如果你有兴趣学习更多关于它的知识,我建议你阅读这篇关于FFT及其与图像处理的关系的文章。
https://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm
对于有学术倾向的读者,可以看看Aaron Bobick在佐治亚理工学院计算机视觉课程上的精彩幻灯片。
https://www.cc.gatech.edu/~afb/classes/CS4495-Fall2014/slides/CS4495-Frequency.pdf
最后,维基百科关于傅里叶变换的页面更详细地介绍了数学,包括它在非图像处理任务中的应用。
项目结构
首先使用本教程的“下载”部分下载源代码和示例图像。一旦你解压缩文件,你将有一个目录组织如下:
$ tree --dirsfirst
.
├── images
│ ├── adrian_01.png
│ ├── adrian_02.png
│ ├── jemma.png
│ └── resume.png
├── pyimagesearch
│ ├── __init__.py
│ └── blur_detector.py
├── blur_detector_image.py
└── blur_detector_video.py
2 directories, 8 files
我们基于FFT的模糊检测算法位于blur_detector.py文件中的pyimagesearch模块中。内部实现了一个函数detect_blur_fft。
我们在两个Python驱动程序脚本中使用detect_blur_fft方法:
-
blur_detector_image:对静态图像进行模糊检测。我在images/目录中为我们提供了一些测试图像,您也应该在自己的图像(模糊的和不