频率域滤波

频率域滤波步骤

共7步骤:

1

4

6.

cpp 复制代码
cv::Mat input = cv::imread("1.JPG", cv::IMREAD_GRAYSCALE);
 cv::imshow("step0_ori", input);
 int w = cv::getOptimalDFTSize(input.cols);
 int h = cv::getOptimalDFTSize(input.rows);
 cv::Mat padded;
 cv::copyMakeBorder(input, padded, 0, h - input.rows, 0, w - input.cols,
  cv::BORDER_CONSTANT, cv::Scalar::all(0));
 padded.convertTo(padded, CV_32FC1);
 cv::imshow("step1_padded", padded);
 for (int i = 0; i < padded.rows; i++)
 {
  float* ptr = padded.ptr<float>(i);
  for (int j = 0; j < padded.cols; j++)
   ptr[j] *= pow(-1, i + j);
 }
 cv::imshow("step2_center", padded);
 cv::Mat plane[] = { padded,cv::Mat::zeros(padded.size(),CV_32F) };
 cv::Mat complexImg;
 cv::merge(plane, 2, complexImg);
 cv::dft(complexImg, complexImg);
 cv::split(complexImg, plane);
 cv::magnitude(plane[0], plane[1], plane[0]);
 plane[0] += cv::Scalar::all(1);
 cv::log(plane[0], plane[0]);
 cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
 cv::imshow("dft", plane[0]);

 cv::Mat gaussianBlur(padded.size(), CV_32FC2);
 float D0 = 2 * 10 * 10;
 for (int i = 0; i < padded.rows; i++)
 {
  float* p = gaussianBlur.ptr<float>(i);
  for (int j = 0; j < padded.cols; j++)
  {
   float d = pow(i - padded.rows / 2, 2) + pow(j - padded.cols / 2, 2);
   p[2 * j] = expf(-d / D0);
   p[2 * j + 1] = expf(-d / D0);
  }
 }
 cv::split(gaussianBlur, plane);
 cv::magnitude(plane[0], plane[1], plane[0]);
 plane[0] += cv::Scalar::all(1);
 cv::log(plane[0], plane[0]);
 cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
 cv::imshow("gaussianBlurKernel", plane[0]);

 multiply(complexImg, gaussianBlur, gaussianBlur);
 cv::split(gaussianBlur, plane);
 cv::magnitude(plane[0], plane[1], plane[0]);
 plane[0] += cv::Scalar::all(1);
 cv::log(plane[0], plane[0]);
 cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
 cv::imshow("gaussianBlurOnDFT", plane[0]);

 cv::idft(gaussianBlur, gaussianBlur);
 cv::split(gaussianBlur, plane);
 cv::magnitude(plane[0], plane[1], plane[0]);
 cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
 cv::imshow("idft-gaussianBlur", plane[0]);

 cv::waitKey();
相关推荐
飞哥数智坊12 小时前
MiniMax 是谁?为什么 M2 一出,大家又沸腾了?
人工智能
leafff12312 小时前
AI研究:轻量模型和专用模型在算力优化上的差异对游戏制作的效率和质量有何影响?
人工智能·游戏
LabVIEW开发13 小时前
LabVIEW用直线边缘检测实现液位测量
数码相机·计算机视觉·labview·labview知识·labview功能·labview程序
吃鱼不卡次13 小时前
RT-DETR解码模块(Decoder)
人工智能·深度学习·cross attention·rt-detr·匈牙利匹配·self attention·对比去噪训练
zhan11451413 小时前
解析平面卷积/pytorch的nn.Conv2d的计算步骤,in_channels与out_channels如何计算而来
人工智能·pytorch·深度学习·cnn·卷积神经网络
Juchecar13 小时前
假设人类能用光波沟通……
人工智能
K姐研究社13 小时前
AipexBase怎么用?AI 原生BaaS平台一句话做后端开发
人工智能
IT_陈寒13 小时前
SpringBoot 3.2新特性实战:这5个隐藏功能让开发效率翻倍🚀
前端·人工智能·后端
IT_陈寒13 小时前
Vue3性能优化实战:这5个技巧让我的应用加载速度提升70% 🚀
前端·人工智能·后端
Mr.Winter`13 小时前
自动驾驶运动规划 | 基于自行车模型的运动学模型和横向动力学模型详细推导图解
人工智能·机器人·自动驾驶·ros