傅里叶变换方法求图像卷积-OpenCV实现 遇到的问题!!!求指教!!!!!!

来源:互联网 发布:动画制作软件手机版 编辑:程序博客网 时间:2024/06/11 16:18

使用的代码类似

  1. void convolveDFT(Mat A, Mat B, Mat& C)  
  2. {    
  3.     C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());  
  4.     Size dftSize;  

  5.     dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);  
  6.     dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);  
  7.     Mat tempA(dftSize, A.type(), Scalar::all(0));  
  8.     Mat tempB(dftSize, B.type(), Scalar::all(0));  

  9.     Mat roiA(tempA, Rect(0,0,A.cols,A.rows));  
  10.     A.copyTo(roiA);  
  11.     Mat roiB(tempB, Rect(0,0,B.cols,B.rows));  
  12.     B.copyTo(roiB);  
  13.     dft(tempA, tempA, 0, A.rows);  
  14.     dft(tempB, tempB, 0, B.rows);  
  15.     mulSpectrums(tempA, tempB, tempA, DFT_COMPLEX_OUTPUT);   
  16.     dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);  
  17.     tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);  
  18. }

=========并不能得到想要的结果================  

例如上面的矩阵是输出矩阵,核矩阵如下面的矩阵

根据优化DFTsize变成8X8的矩阵。进行卷积操作。然后经过傅里叶逆变换后的矩阵如下图所示

经过计算其中的 330,330,330;840,840,840;1305,1305,1305才是我想要的卷积后的矩阵。tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);并不能得到我想要的矩阵啊!!!!!!怎么回事????????????????????????


======================实验了一晚上 已找到解决方法=========================================

有效的卷积后的图像信息从 第kernel.cols-1 kernel.rows-1开始

 cv::dft(tempA,tempA,cv::DFT_INVERSE+cv::DFT_SCALE);
 tempA(cv::Rect(kernel.cols-1,kernel.rows-1,dst.cols,dst.rows)).copyTo(dst);

这样就可以得到正确的图像了

也解释了前面对于优化DFT尺寸为何如此设置。输出图像大小为何如此设置



阅读全文
0 0
原创粉丝点击