频率域滤波

频率域滤波步骤

共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();
相关推荐
罗西的思考4 分钟前
探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并
人工智能
小马过河R25 分钟前
通俗理解CLIP模型如何实现图搜图乃至文搜图
人工智能·深度学习·机器学习·语言模型·nlp
KarudoLee27 分钟前
AIGC6——AI的哲学困境:主体性、认知边界与“天人智一“的再思考
人工智能
xcLeigh41 分钟前
计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet
人工智能·计算机视觉·ai·cnn·卷积神经网络
azoo44 分钟前
jupyter notebook 无法启动- markupsafe导致
ide·人工智能·jupyter
Julian.zhou1 小时前
A2A与MCP Server:AI智能体协作与工具交互的核心协议对比
人工智能·架构·交互
CareyWYR1 小时前
每周AI论文速递(250407-250411)
人工智能
机器之心2 小时前
魔改AlphaZero后,《我的世界》AI老玩家问世,干活不用下指令
人工智能
Romantic Rose2 小时前
你所拨打的电话是空号?手机状态查询API
大数据·人工智能
放羊郎2 小时前
图像颜色空间对比(Opencv)
opencv·计算机视觉·rgb·灰度图像·bgr