opencv中C++实现傅里叶变换,低通滤波以及逆变换问题

cuoqin4246 2016-07-05 11:22:39
这是我的C++的程序。首先对提取的图像进行傅立叶变换,然后平移中心,接着对平移后的图像使用高斯低通滤波。接着对图像再次进行中心平移然后傅立叶逆变换,最后得到的图像上面有许多格点。
如果我按照opencv论坛里面的傅立叶频域处理的话,对频域图像归一化后滤波,但是逆变化得到的确实一幅全黑的图像。求解应该怎么办。我最终想要得到平滑处理的图像,类似于matlab中fft2和ifft的。
下面是我的图像和程序


#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
int main()
{

Mat img = imread("C:\\Users\\LPX\\Desktop\\lena.jpg",0);
imshow("Original Image",img);
Mat dftInput1, dftImage1, inverseDFT, inverseDFTconverted;
img.convertTo(dftInput1, CV_32F);
dft(dftInput1, dftImage1);
imshow("dft",dftImage1);
int cx = dftImage1.cols/2;
int cy = dftImage1.rows/2;
Mat q0(dftImage1, Rect(0,0,cx,cy)); // Top-Left
Mat q1(dftImage1, Rect(cx,0,cx,cy)); // Top-Right
Mat q2(dftImage1, Rect(0,cy,cx,cy)); // Bottom-Left
Mat q3(dftImage1, Rect(cx,cy,cx,cy)); // Bottom-Right
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
//normalize(dftImage1, dftImage1, 0, 1, CV_MINMAX);
imshow("***",dftImage1);
Scalar s0=sum(dftImage1);
int m=dftImage1.rows;
int n=dftImage1.cols;
Mat gaussianBlur(m,n, CV_32F);
float D0 = 2*50*50;
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
float d = (i-m/2)*(i-m/2) +(j-n/2)*(j-n/2);
float m=-d/D0;
gaussianBlur.at<float>(i,j)=exp(m);

}
}
multiply(dftImage1, gaussianBlur, gaussianBlur);
int cx1 = gaussianBlur.cols/2;
int cy1 = gaussianBlur.rows/2;

Mat r0(gaussianBlur, Rect(0,0,cx1,cy1)); // Top-Left
Mat r1(gaussianBlur, Rect(cx1,0,cx1,cy1)); // Top-Right
Mat r2(gaussianBlur, Rect(0,cy1,cx1,cy1)); // Bottom-Left
Mat r3(gaussianBlur, Rect(cx1,cy1,cx1,cy1)); // Bottom-Right

Mat tmp1;
r0.copyTo(tmp1);
r3.copyTo(q0);
tmp1.copyTo(q3);

r1.copyTo(tmp1);
r2.copyTo(r1);
tmp1.copyTo(r2);
imshow("gaussian",gaussianBlur);
idft(gaussianBlur, inverseDFT, DFT_SCALE | DFT_REAL_OUTPUT ); // Applying IDFT
inverseDFT.convertTo(inverseDFTconverted, CV_8U);
Scalar s1=sum(gaussianBlur);
imshow("Output", inverseDFTconverted);

cout<<s0.val[0]<<endl;
cout<<s1.val[0];
waitKey(0);
return 0;


}



...全文
4303 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbj11031 2020-03-08
  • 打赏
  • 举报
回复
问一下转两次象限干什么,那不是白转了吗
weixin_34855848 2016-08-20
  • 打赏
  • 举报
回复
滤波有可能把一些图像信息滤掉了
cuoqin4246 2016-07-20
  • 打赏
  • 举报
回复
以后做题还是要小心呀,题干的程序已经可以解决问题了,只需要把逆中心部分q0改成r0,q3改成r3就好了。 哎~~~
shiter 2016-07-06
  • 打赏
  • 举报
回复
这个lena图本身就是512*512的吧? 或者说本身就是那啥2的倍数?
cuoqin4246 2016-07-06
  • 打赏
  • 举报
回复
引用 9 楼 wangyaninglm 的回复:
这个lena图本身就是512*512的吧? 或者说本身就是那啥2的倍数?
版主,你有频率滤波,并且逆变换的例子么 能不能接我看看
cuoqin4246 2016-07-06
  • 打赏
  • 举报
回复
版主,你有频率滤波,并且逆变换的例子么 能不能接我看看
shiter 2016-07-06
  • 打赏
  • 举报
回复
莫得啊,我主要做的都是自然图像处理,信号这块不太熟悉
赵4老师 2016-07-05
  • 打赏
  • 举报
回复
引用 7 楼 cuoqin4246 的回复:
如果我现在就单单用opencv做频域低通滤波的话,我现在逆变化得到结果是有问题的呀,我总觉的我哪里没搞好,找不到现在,4哥给点建议
建议先编译链接调试网上能搜到的运行没有问题的相关代码。
cuoqin4246 2016-07-05
  • 打赏
  • 举报
回复
如果我现在就单单用opencv做频域低通滤波的话,我现在逆变化得到结果是有问题的呀,我总觉的我哪里没搞好,找不到现在,4哥给点建议
赵4老师 2016-07-05
  • 打赏
  • 举报
回复
matlab中fft2和ifft和OpenCV中对应的函数不完全一样。我猜。 所以你变换和逆变换必须选择其中一个。
cuoqin4246 2016-07-05
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
你说的这些变换都要求图片尺寸恰好是2的整数次幂吧。



那我通过 ,getOptimalDFTSize补足起最佳尺寸,之后再去做的话,我发现回不去了得到的结果是这样的
中间做了归一化了,不做归一化频谱图像没法显示,4哥这怎么看
赵4老师 2016-07-05
  • 打赏
  • 举报
回复
你说的这些变换都要求图片尺寸恰好是2的整数次幂吧。
cuoqin4246 2016-07-05
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
图像处理基础 http://www.codeproject.com/Articles/781213/Fundamentals-of-Image-Processing-behind-the-scenes
4哥 打开了 能不能明示一下,我看了 他也是介绍一下怎么变换的这个呀
cuoqin4246 2016-07-05
  • 打赏
  • 举报
回复
4哥打不开啊

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧