ZBLOG

快速傅里叶增强图像边缘

使用快速傅里叶变换(FFT)增强图像边缘的方法主要是通过在频域中操作来实现的。下面是一个示例,展示了如何在 C++ 中使用 OpenCV 对图像进行傅里叶变换以增强其边缘。

C++ 代码示例

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace cv;
  4. using namespace std;
  5. // 函数用于增强图像的边缘
  6. Mat enhanceEdgesUsingFFT(const Mat& inputImage) {
  7. // 确保输入图像为灰度图
  8. Mat grayImage;
  9. if (inputImage.channels() == 3) {
  10. cvtColor(inputImage, grayImage, COLOR_BGR2GRAY);
  11. } else {
  12. grayImage = inputImage.clone();
  13. }
  14. // 将灰度图转换为浮点型
  15. Mat floatImage;
  16. grayImage.convertTo(floatImage, CV_32F);
  17. // 执行快速傅里叶变换
  18. Mat padded; // 为 FFT 做填充,确保大小为2的幂次
  19. int m = getOptimalDFTSize(floatImage.rows);
  20. int n = getOptimalDFTSize(floatImage.cols);
  21. copyMakeBorder(floatImage, padded, 0, m - floatImage.rows, 0, n - floatImage.cols, BORDER_CONSTANT, Scalar(0));
  22. Mat planes[] = { padded, Mat_<float>::zeros(padded.size()) };
  23. Mat complexI;
  24. merge(planes, 2, complexI); // 合并通道到一个复数矩阵
  25. dft(complexI, complexI); // 快速傅里叶变换
  26. // 将频域移动到中心位置(频谱)
  27. split(complexI, planes);
  28. magnitude(planes[0], planes[1], planes[0]); // 获取幅度谱
  29. Mat magnitudeSpectrum = planes[0];
  30. magnitudeSpectrum += Scalar::all(1); // 避免对数运算时出现log(0)
  31. log(magnitudeSpectrum, magnitudeSpectrum); // 对幅度谱取对数
  32. normalize(magnitudeSpectrum, magnitudeSpectrum, 0, 255, NORM_MINMAX);
  33. imshow("Magnitude Spectrum", magnitudeSpectrum);
  34. // 创建高通滤波器(理想高通滤波器)
  35. int centerX = padded.cols / 2;
  36. int centerY = padded.rows / 2;
  37. for (int i = 0; i < padded.rows; i++) {
  38. for (int j = 0; j < padded.cols; j++) {
  39. double distance = sqrt(pow(i - centerY, 2) + pow(j - centerX , 2));
  40. if (distance < 30) { // 设置截止频率阈值
  41. planes[0].at<float>(i,j) = 0; // 在低频区域设为零
  42. planes[1].at<float>(i,j) = 0;
  43. }
  44. }
  45. }
  46. merge(planes, 2, complexI); // 合并回去
  47. idft(complexI ,complexI ); // 傅里叶反变换
  48. split(complexI ,planes);
  49. Mat enhanced_image;
  50. magnitude(planes[0], planes[1], enhanced_image);
  51. normalize(enhanced_image ,enhanced_image ,0 ,255 ,NORM_MINMAX);
  52. enhanced_image.convertTo(enhanced_image,CV_8U);
  53. return enhanced_image; // 返回增强后的图像
  54. }
  55. int main() {
  56. string image_path = "F:AI/Learning/9022625033_K1609563_T001_4_13.jpg";
  57. Mat image = imread(image_path);
  58. if (image.empty()) {
  59. cerr << "Error: Could not open or find the image!" << endl;
  60. return -1;
  61. }
  62. Mat enhancedEdges = enhanceEdgesUsingFFT(image);
  63. imshow("Original Image", image);
  64. imshow("Enhanced Edges using FFT", enhancedEdges);
  65. waitKey(0);
  66. return 0;
  67. }

注意事项:

  1. 库依赖:确保你已经安装了 OpenCV,并包含了相关的头文件。

  2. 处理流程

    • 读取和预处理:将输入图像转换为灰度,如果是彩色的话。
    • 快速傅里叶变换:使用 dft 函数计算傅里叶变换,然后获取幅度谱。
    • 高通滤波器:构建一个理想的高通滤波器,用于去除低频部分,以增强边缘特征。
    • 反向傅里叶变换:使用 idft 函数将修改后的频域信息转换回空间域。
  3. 参数调整:在创建高通滤波器时,可以根据需要调整截止频率。例如,将 30 改成其他值可以改变哪些特征被增强或抑制。

  4. 显示结果:最后通过 OpenCV 的 imshow() 显示原始和增强后的图像。

编译与运行:

请参照之前提供的编译说明。如果是在 Linux 系统下,可以通过命令行执行以下编译命令:

  1. g++ your_code.cpp -o output_program `pkg-config --cflags --libs opencv4`

然后运行生成的可执行文件以查看效果。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20916

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?