ZBLOG

快速傅里叶增强图像边缘

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

C++ 代码示例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 函数用于增强图像的边缘
Mat enhanceEdgesUsingFFT(const Mat& inputImage) {
    // 确保输入图像为灰度图
    Mat grayImage;
    if (inputImage.channels() == 3) {
        cvtColor(inputImage, grayImage, COLOR_BGR2GRAY);
    } else {
        grayImage = inputImage.clone();
    }

    // 将灰度图转换为浮点型
    Mat floatImage;
    grayImage.convertTo(floatImage, CV_32F);

    // 执行快速傅里叶变换
    Mat padded;                            // 为 FFT 做填充,确保大小为2的幂次
    int m = getOptimalDFTSize(floatImage.rows);
    int n = getOptimalDFTSize(floatImage.cols);
    
    copyMakeBorder(floatImage, padded, 0, m - floatImage.rows, 0, n - floatImage.cols, BORDER_CONSTANT, Scalar(0));

    Mat planes[] = { padded, Mat_<float>::zeros(padded.size()) };
    Mat complexI;
    
    merge(planes, 2, complexI);          // 合并通道到一个复数矩阵

    dft(complexI, complexI);             // 快速傅里叶变换

    // 将频域移动到中心位置(频谱)
    split(complexI, planes);
    
    magnitude(planes[0], planes[1], planes[0]);   // 获取幅度谱
     
    Mat magnitudeSpectrum = planes[0];  
     
    magnitudeSpectrum += Scalar::all(1);           // 避免对数运算时出现log(0)
 
     log(magnitudeSpectrum, magnitudeSpectrum);      // 对幅度谱取对数
   
     normalize(magnitudeSpectrum, magnitudeSpectrum, 0, 255, NORM_MINMAX); 

     imshow("Magnitude Spectrum", magnitudeSpectrum);

     // 创建高通滤波器(理想高通滤波器)
     int centerX = padded.cols / 2;
     int centerY = padded.rows / 2;

     for (int i = 0; i < padded.rows; i++) {
         for (int j = 0; j < padded.cols; j++) {
             double distance = sqrt(pow(i - centerY, 2) + pow(j - centerX , 2));
             if (distance < 30) {                // 设置截止频率阈值
                 planes[0].at<float>(i,j) = 0;   // 在低频区域设为零
                 planes[1].at<float>(i,j) = 0;   
             }
         }
     }

     merge(planes, 2, complexI);       // 合并回去
  
     idft(complexI ,complexI );          // 傅里叶反变换

     split(complexI ,planes);           
  
     Mat enhanced_image;
  
     magnitude(planes[0], planes[1], enhanced_image); 
  
     normalize(enhanced_image ,enhanced_image ,0 ,255 ,NORM_MINMAX); 
     
     enhanced_image.convertTo(enhanced_image,CV_8U); 

     return enhanced_image;               // 返回增强后的图像 
}

int main() {
   string image_path = "F:AI/Learning/9022625033_K1609563_T001_4_13.jpg"; 
   Mat image = imread(image_path);

   if (image.empty()) {
       cerr << "Error: Could not open or find the image!" << endl;
       return -1;
   }

   Mat enhancedEdges = enhanceEdgesUsingFFT(image);
   
   imshow("Original Image", image);
   imshow("Enhanced Edges using FFT", enhancedEdges);

   waitKey(0);                     
    
   return 0;
}

注意事项:

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

  2. 处理流程

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

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

编译与运行:

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

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

注册

已经有帐号?