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