Hello Mat

 找回密码
 立即注册
查看: 7017|回复: 0

对图像傅里叶变换

[复制链接]

10

主题

15

帖子

0

金钱

新手上路

Rank: 1

积分
15
发表于 2016-10-27 10:29:37 | 显示全部楼层 |阅读模式
  1. #include <opencv2/core/core.hpp>  
  2. #include<opencv2/highgui/highgui.hpp>  
  3. #include<opencv2/imgproc/imgproc.hpp>  
  4. #include <iostream>  
  5.    
  6. using namespace cv;  
  7. using namespace std;  
  8.    
  9. int main()
  10. {  
  11.         Mat src;
  12.         src= imread("E:\\text/pic1.jpg");   
  13.       if(src.empty())  
  14.        {  
  15.               return-1;  
  16.        }  
  17.    
  18.        Mat src_gray;  
  19.        cvtColor(src,src_gray,CV_RGB2GRAY);//灰度图像做傅里叶变换  
  20.    
  21.        int m = getOptimalDFTSize(src_gray.rows);//2,3,5的倍数有更高效率的傅里叶转换  
  22.        int n = getOptimalDFTSize(src_gray.cols);  
  23.    
  24.        Mat dst;  
  25.        ///把灰度图像放在左上角,在右边和下边扩展图像,扩展部分填充为0;  
  26.        copyMakeBorder(src_gray,dst,0,m-src_gray.rows,0,n-src_gray.cols,BORDER_CONSTANT,Scalar::all(0));  
  27.        cout<<dst.size()<<endl;  
  28.    
  29.        //新建一个两页的array,其中第一页用扩展后的图像初始化,第二页初始化为0  
  30.        Mat planes[] = {Mat_<float>(dst), Mat::zeros(dst.size(), CV_32F)};  
  31.        Mat  completeI;  
  32.        merge(planes,2,completeI);//把两页合成一个2通道的mat  
  33.    
  34.        //对上边合成的mat进行傅里叶变换,支持原地操作,傅里叶变换结果为复数。通道1存的是实部,通道2存的是虚部。  
  35.        dft(completeI,completeI);  
  36.    
  37.        split(completeI,planes);//把变换后的结果分割到各个数组的两页中,方便后续操作  
  38.        magnitude(planes[0],planes[1],planes[0]);//求傅里叶变换各频率的幅值,幅值放在第一页中。  
  39.    
  40.        Mat magI = planes[0];  
  41.        //傅立叶变换的幅度值范围大到不适合在屏幕上显示。高值在屏幕上显示为白点,  
  42.        //而低值为黑点,高低值的变化无法有效分辨。为了在屏幕上凸显出高低变化的连续性,我们可以用对数尺度来替换线性尺度:  
  43.        magI+= 1;  
  44.        log(magI,magI);//取对数  
  45.        magI= magI(Rect(0,0,src_gray.cols,src_gray.rows));//前边对原始图像进行了扩展,这里把对原始图像傅里叶变换取出,剔除扩展部分。  
  46.    
  47.        //这一步的目的仍然是为了显示。 现在我们有了重分布后的幅度图,  
  48.        //但是幅度值仍然超过可显示范围[0,1] 。我们使用 normalize() 函数将幅度归一化到可显示范围。  
  49.        normalize(magI,magI,0,1,CV_MINMAX);//傅里叶图像进行归一化。  
  50.    
  51.        //重新分配象限,使(0,0)移动到图像中心,  
  52.        //在《数字图像处理》中,傅里叶变换之前要对源图像乘以(-1)^(x+y)进行中心化。  
  53.        //这是是对傅里叶变换结果进行中心化  
  54.        int cx = magI.cols/2;  
  55.        int cy = magI.rows/2;  
  56.    
  57.        Mat tmp;  
  58.        Mat q0(magI,Rect(0,0,cx,cy));  
  59.        Mat q1(magI,Rect(cx,0,cx,cy));  
  60.        Mat q2(magI,Rect(0,cy,cx,cy));  
  61.        Mat q3(magI,Rect(cx,cy,cx,cy));  
  62.    
  63.         
  64.        q0.copyTo(tmp);  
  65.        q3.copyTo(q0);  
  66.        tmp.copyTo(q3);  
  67.    
  68.        q1.copyTo(tmp);  
  69.        q2.copyTo(q1);  
  70.        tmp.copyTo(q2);  
  71.    
  72.        namedWindow("InputImage");  
  73.        imshow("InputImage",src);  
  74.    
  75.        namedWindow("SpectrumImage");  
  76.        imshow("SpectrumImage",magI);  
  77.        imwrite("E:\\text/magI.jpg",magI);
  78.    
  79.        waitKey(0);  
  80.        return 0;  
  81. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-11-22 16:51 , Processed in 0.211171 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表