Ubuntu下Opencv的idft实现Matlab的ifft2

来源:互联网 发布:希捷数据恢复要多少钱 编辑:程序博客网 时间:2024/06/10 23:42
  1. 定义一维数组
double real_imge[]={-0.248337 , 0.114635 ,-0.322947 , 0.169408 ,  0.996033 , 0.0851161,-0.768792 , 0.578845 , -0.251503 , 0.0603351,                        -0.352855 ,-0.575426 , 0.0513321,-0.0906095,  0.53032  ,-0.243324 , 0.130741 , 0.0202948,  0.344676 , 0.385327 ,                        -0.898984 ,-0.145177 ,-0.846889 ,-0.357738 , -0.176824 ,-0.145695 , 0.257698 ,-0.23542  , -0.63976  ,-0.102756 ,                         0.810175 ,-0.110263 , 0.391156 ,-0.147374 ,  0.290292 ,-0.380291 ,-0.171209 ,-0.129154 ,  0.53679  ,-0.689413 ,                        -0.352977 ,-0.0218513, 0.0344554, 0.205329 , -0.737175 , 0.213691 ,-0.0219428,-0.427656 , -0.172399 ,-0.0946989};

注:这里需要注意的是,输入值仔细,我就是把几个数值输错了,最后因为这个错误多调试了好久!!!!!!!!!!!!
2. 初始化矩阵

for(int i=0;i<bt.cols;i++)    {        for(int j=0;j<bt.rows;j++)        {            bt.at<Vec2d>(i,j)[0]=real_imge[count++];//给矩阵0通道赋值            bt.at<Vec2d>(i,j)[1]=real_imge[count++];//给矩阵1通道赋值            cout<<bt.at<Vec2d>(i,j);//输出矩阵点值        }        cout<<endl;    }

这个地方注意输入的参数的类型,这里Vec2d存储了实部和虚部,访问用(i,j)
3. 傅里叶逆变换

idft(bt,bt,DFT_COMPLEX_OUTPUT+DFT_SCALE,0);//你傅里叶变换

这个地方注意参数DFT_COMPLEX_OUTPUT+DFT_SCALE对应着Matlab里的参数,不然的不出正确的结果
4. 分离通道

vector<Mat> planes(2);split(bt,planes);//分离通道,planes[0]存储实部,planes[0]存储虚部

这里实现了Matlab的:

result=real(ifft2(in));//in=real_imge
原创粉丝点击