开发者都在使用的OpenCV FFT傅里叶检测上传到服务器上的模糊图片

快速傅里叶变换(Fast Fourier Transform,FFT)是一种可在 O(nlogn)

时间内完成的离散傅里叶变换(Discrete Fourier transform,DFT)算法。具体什么是傅里叶变换,这里不再讲述,有兴趣的小伙伴们可以自行百度。

在计算机视觉方面,我们经常将FFT视为代表两个域中的图像的图像处理工具:

  1. 傅立叶(即频域)域
  2. 空间域

因此,FFT以实部和虚部表示图像。

通过分析这些值,我们可以执行图像处理例程,例如模糊,边缘检测,阈值化,纹理分析,甚至可以进行模

利用opencv傅里叶变换检测模糊图片

import numpy as np
import cv2
def detect_blur_fft(image, size=60, thresh=10):
      (h, w) = image.shape
      (cX, cY) = (int(w / 2.0), int(h / 2.0))
      fft = np.fft.fft2(image)
      fftShift = np.fft.fftshift(fft)
      fftShift[cY - size:cY + size, cX - size:cX + size] = 0
      fftShift = np.fft.ifftshift(fftShift)
      recon = np.fft.ifft2(fftShift)
      magnitude = 20 * np.log(np.abs(recon))
      mean = np.mean(magnitude)
      return (mean, mean <= thresh)

首先我们建立一个利用opencv快速傅里叶变换检测模糊照片的函数,函数接受:

image:我们用于模糊检测的输入图像

size:围绕图像中心点的半径大小,我们将使FFT偏移为零

thresh:阀值,该值将与幅值的平均值进行比较,以确定图像是否被认为是模糊

模糊图片检测

这里,我们使用NumPy的内置算法,计算图片的FFT

然后,我们将结果的零频率分量(DC分量)移到中心,以便于后期数据分析。

通过fftShift[cY – size:cY + size, cX – size:cX + size] = 0行将FFT移位的中心归零(即去除低频)

应用反向移位将直流分量放回top-left

应用逆变换FFT

已经将中心DC值归零后,再次对重构图像进行频谱分析magnitude = 20 * np.log(np.abs(recon))。

计算幅度的平均值mean = np.mean(magnitude)。

返回2元组 :幅度的平均值以及指示输入图像是否模糊的布尔值

代码截图

以上函数便是完整的图片模糊检测的全部代码,中间的FFT变换,若感兴趣的可以好好学习一下高等数学的基础知识,有了此函数,我们传入需要检测的图片,便可以进行图片的检测了。

模糊图片检测

opencv模糊图片检测

orig = cv2.imread("2.jpg")
orig = cv2.resize(orig, (600,500))
gray = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
(mean, blurry) = detect_blur_fft(gray, size=60,thresh=10)
image = np.dstack([gray] * 3)
color = (0, 0, 255) if blurry else (0, 255, 0)
text = "Blurry ({:.4f})" if blurry else "Not Blurry ({:.4f})"
text = text.format(mean)
cv2.putText(image, text, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7,color, 2)
cv2.imshow("Output", image)
cv2.waitKey(0)

首先我们传入需要进行检测的图片,进行图片的resize,然后cv2.cvtColor把图片转入灰度空间,便于计算,使用先前建立的函数,进行图片的检测,等待返回结果。

代码截图

模糊图片检测

小伙伴们可以根据自己领域内的图片,对检测图片的阈值进行设置来适应不同平台,不同领域的图片模糊检测

当然根据以上的FFT技术,我们也可以进行视频的模糊实时检测,这里小编不再介绍,前期也介绍了很多关于视频检测方面的方法,其实是把视频帧提取出来,每帧图片进行处理,跟图片检测一样的机制。