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