免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8447 | 回复: 1
打印 上一主题 下一主题

[函数] [OpenCV] 傅立叶变换 和 逆向傅里叶变换 [复制链接]

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-22 13:26 |只看该作者 |倒序浏览
从网上Google了一些傅立叶变换的代码,千篇一律,方法一样,错误也一样。
凭猜测和调试,整改了一番,贴于此地留个存档。但可能我的理解仍然有错误,因此仅供参考
  1. #include <cv.h>
  2. #include <highgui.h>

  3. // 1.将图片im扩展到最佳傅立叶变换尺寸作为实部,并上一个全零的虚部,得到复数image_Cp
  4. // 2.将image_Cp作傅立叶变换,分解成实部和虚部分别显示
  5. // 3.将作过傅立叶变换的image_Cp做反向傅立叶变换,分解成实部和虚部分别显示
  6. // 4.从第三步得到的image_Cp中的实部中抠出im,应当和第一步中im是一样的
  7. int main()
  8. {
  9.     const char* filename = "D:\\sources\\cpp001\\1.jpg";
  10.     //const char* filename = "D:\\sources\\cpp001\\IMG_0988.JPG";

  11.     IplImage* im = cvLoadImage( filename, CV_LOAD_IMAGE_GRAYSCALE );
  12.     cvShowImage( "1", im );

  13.     // 获取傅立叶变换的最佳尺寸(大于等于原先尺寸)
  14.     int dft_h = cvGetOptimalDFTSize( im->height );
  15.     int dft_w = cvGetOptimalDFTSize( im->width );
  16.     if( dft_h<=0 || dft_w<=0 )
  17.     {
  18.         cvReleaseImage( &im );
  19.         return 0;
  20.     }
  21.     IplImage* image_Re = cvCreateImage( cvSize(dft_w,dft_h), IPL_DEPTH_64F, 1 );
  22.     IplImage* image_Im = cvCreateImage( cvSize(dft_w,dft_h), IPL_DEPTH_64F, 1 );
  23.     CvMat* image_Cp = cvCreateMat( dft_h, dft_w, CV_64FC2 );
  24.     {
  25.         // 将 im 拷贝到 image_Re 中,剩余部分置零
  26.         if( dft_w > im->width || dft_h > im->height )
  27.             cvZero( image_Re );
  28.         CvMat tmp;
  29.         cvGetSubRect( image_Re, &tmp, cvRect(0,0,im->width,im->height) );
  30.         cvScale( im, &tmp, 1.0, 0.0 );
  31.         // 将 image_Im 置零
  32.         cvZero( image_Im );
  33.         // 将 image_Re 和 image_Im 合并成 image_Cp
  34.         cvMerge( image_Re, image_Im, NULL, NULL, image_Cp );
  35.     }

  36.     // 傅立叶变换
  37.     cvDFT( image_Cp, image_Cp, CV_DXT_FORWARD, im->height );

  38.     // 分解 image_Cp 的实部和虚部
  39.     cvSplit( image_Cp, image_Re, image_Im, 0, 0 );

  40.     //// test
  41.     //cvZero( image_Re );
  42.     //cvMerge( image_Re, image_Im, NULL, NULL, image_Cp );

  43.     // 显示实部
  44.     double Min, Max;
  45.     cvMinMaxLoc( image_Re, &Min, &Max, NULL, NULL, NULL );
  46.     cvScale( image_Re, image_Re, 1.0/(Max-Min), -Min/(Max-Min) );
  47.     cvShowImage( "2R", image_Re );

  48.     // 显示虚部
  49.     cvMinMaxLoc( image_Im, &Min, &Max, NULL, NULL, NULL );
  50.     cvScale( image_Im, image_Im, 1.0/(Max-Min), -Min/(Max-Min) );
  51.     cvShowImage( "2I", image_Im );

  52.     //// 显示 log( 1 + (R^2+I^2)^0.5 )
  53.     //cvPow( image_Re, image_Re, 2.0);
  54.     //cvPow( image_Im, image_Im, 2.0);
  55.     //cvAdd( image_Re, image_Im, image_Re, NULL);
  56.     //cvPow( image_Re, image_Re, 0.5 );
  57.     //cvAddS( image_Re, cvScalarAll(1.0), image_Re, NULL );
  58.     //cvLog( image_Re, image_Re );
  59.     //cvMinMaxLoc(image_Re, &Min, &Max, NULL, NULL, NULL );
  60.     //cvScale(image_Re, image_Re, 1.0/(Max-Min), -Min/(Max-Min) );
  61.     //cvShowImage("1X", image_Re);

  62.     // 反向傅立叶变换
  63.     cvDFT( image_Cp,  image_Cp, CV_DXT_INVERSE_SCALE, im->height );

  64.     // 分解 image_Cp 的实部和虚部
  65.     cvSplit( image_Cp, image_Re, image_Im, 0, 0 );

  66.     // 将实部还原为im格式,按理应当和原先im的数据一致
  67.     CvMat tmp;
  68.     cvGetSubRect( image_Re, &tmp, cvRect(0,0,im->width,im->height) );
  69.     cvScale( &tmp, im, 1.0, 0.0 );
  70.     cvShowImage( "4", im );

  71.     // 实部
  72.     cvMinMaxLoc( image_Re, &Min, &Max, NULL, NULL, NULL );
  73.     cvScale( image_Re, image_Re, 1.0/(Max-Min), -Min/(Max-Min) );
  74.     cvShowImage( "3R", image_Re );

  75.     // 虚部
  76.     cvMinMaxLoc( image_Im, &Min, &Max, NULL, NULL, NULL );
  77.     cvScale( image_Im, image_Im, 1.0/(Max-Min), -Min/(Max-Min) );
  78.     cvShowImage( "3I", image_Im );

  79.     cvWaitKey();

  80.     cvReleaseMat( &image_Cp );
  81.     cvReleaseImage( &image_Re );
  82.     cvReleaseImage( &image_Im );
  83.     cvReleaseImage( &im );
  84.     cvDestroyAllWindows( );

  85.     return 0;
  86. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-01-22 13:37 |只看该作者
mark,先谢过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP