图像清晰度判断

FFT(Fast Fourier Transform)是一种常用的频域分析工具,可以将图像从空间域转换到频域。在频域中,高频对应了图像的细节部分,低频对应了图像的大致形状。因此,我们可以通过计算图像在高频部分的能量来评估图像的清晰度。

double computeSharpnessFFT(const cv::Mat& img, const cv::Mat& mask)
{
  // 输入检查

  cv::Mat imgMasked;
  img.copyTo(imgMasked, mask); 

  cv::Mat imgFloat;
  imgMasked.convertTo(imgFloat, CV_32F);

  cv::Mat planes[] = {imgFloat, cv::Mat::zeros(img.size(), CV_32F)};
  cv::Mat complexImg;
  cv::merge(planes, 2, complexImg);  

  cv::dft(complexImg, complexImg);

  cv::split(complexImg, planes);
  cv::magnitude(planes[0], planes[1], planes[0]);  
  cv::Mat mag = planes[0];

  mag += cv::Scalar::all(1); 
  cv::log(mag, mag);

  // 直接取中心区域作为高频
  int cx = mag.cols/2;
  int cy = mag.rows/2;

  cv::Mat hf(mag, cv::Rect(cx/2, cy/2, cx, cy));

  cv::Scalar mean, stddev;
  cv::meanStdDev(hf, mean, stddev);

  return stddev[0] * stddev[0]; 
}

高频部分包含大量随机边缘信息,其均值易趋近于零,不具可区分性;而方差表示偏离程度,越大说明高频信息强度越强,再场景不变的情况下,即表征越清晰

你可能感兴趣的:(计算机视觉,opencv,人工智能)