频率域滤波

频率域滤波步骤

共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();
相关推荐
CTA量化套保1 分钟前
最新AI量化效率提升,用示例拆解练习压实路径
人工智能·python
隔窗听雨眠1 分钟前
拓宽智能体跑道:亚马逊云科技AgentCore Runtime配额升级背后的基础设施逻辑
大数据·人工智能·科技
zhiSiBuYu05174 分钟前
混合检索实战指南:关键词与向量的完美融合
人工智能·python·机器学习
蓝速科技6 分钟前
蓝速科技 3D 全息舱 AI 数字人博物馆导览效果实录
人工智能·科技·3d
weixin_413063217 分钟前
复现 MatchED 边缘检测模型(单张图片重复8次,训练200 epoch)
python·算法·计算机视觉·边缘检测模型
AI-好学者7 分钟前
RAG知识点_3_高级实践
人工智能·ai·架构·langchain·ai编程
大神科技AI定制12 分钟前
告别Excel手工报价,用AI给非标产品报价提效
人工智能
AI视频剪辑官12 分钟前
播客切片工具选型核心评价维度
网络·人工智能·算法
Black蜡笔小新12 分钟前
制造业AI质检工作站/企业AI算力工作站DLTM重构工业质检全流程体系
人工智能·重构
Kyrie6783 小时前
SkillOpt:把 Agent 的技能文件当作可训练参数
人工智能