图像清晰度判断

该代码段展示了一个计算图像清晰度的方法,通过FFTFastFourierTransform将图像转换到频域,提取高频部分的能量。计算高频部分的方差来评估图像的清晰度,方差越大表明高频信息越强,图像越清晰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]; 
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值