频率域滤波

频率域滤波步骤

共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();
相关推荐
源之缘-OFD先行者4 分钟前
基于YOLOv11的无人机目标检测实战(Windows环境)
人工智能·yolo·目标检测
CoovallyAIHub14 分钟前
从大象到老鼠,FPN如何一次搞定?多尺度检测核心解析
深度学习·算法·计算机视觉
yergen19 分钟前
【具身智能】本地实时语音识别kaldi在正点原子RK3588上部署
人工智能·语音识别
蹦蹦跳跳真可爱58938 分钟前
Python----目标检测(使用YOLOV8网络训练人脸)
人工智能·python·yolo·目标检测
AI视觉网奇1 小时前
docker 安装windows
人工智能·深度学习
人帅气质佳A1 小时前
【论文阅读】HCCF:Hypergraph Contrastive Collaborative Filtering
人工智能·深度学习
强盛小灵通专卖员1 小时前
X00211-基于残差edge-graph注意力机制的深度强化学习优化车辆路径问题
人工智能·深度学习·北大核心·sci期刊·小论文
欧阳码农1 小时前
5分钟带你搞懂从0打造一个ChatGPT
人工智能·机器学习·chatgpt
在猴站学算法1 小时前
机器学习(西瓜书) 第四章 决策树
人工智能·决策树·机器学习
运器1232 小时前
【一起来学AI大模型】微调技术:LoRA(Low-Rank Adaptation) 的实战应用
人工智能·pytorch·python·深度学习·ai·ai编程