频率域滤波

频率域滤波步骤

共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();
相关推荐
金融小师妹1 小时前
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
大数据·人工智能·算法
武子康1 小时前
大语言模型 10 - 从0开始训练GPT 0.25B参数量 补充知识之模型架构 MoE、ReLU、FFN、MixFFN
大数据·人工智能·gpt·ai·语言模型·自然语言处理
广州智造1 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
jndingxin2 小时前
OpenCV CUDA模块中矩阵操作------降维操作
人工智能·opencv
MARS_AI_3 小时前
智能呼叫系统中的NLP意图理解:核心技术解析与实战
人工智能·自然语言处理·nlp·交互·信息与通信
Trent19853 小时前
影楼精修-肤色统一算法解析
图像处理·人工智能·算法·计算机视觉
Blossom.1185 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
科技小E6 小时前
EasyRTC嵌入式音视频通信SDK打造带屏IPC全场景实时通信解决方案
人工智能·音视频
ayiya_Oese6 小时前
[模型部署] 3. 性能优化
人工智能·python·深度学习·神经网络·机器学习·性能优化