傅立叶变换高斯滤波器误差

时间:2014-02-15 15:47:27

标签: c++ opencv fft

我是openCV的新手,我正在尝试使用频域中的高斯滤波器来过滤图像。但是有一个运行时错误 “在cv :: mulSpectrum中断言失败(type == srcB.type()&& srcA.size()== srcB.size())” 我知道这是由我的过滤器的返回类型引起的,类型不匹配,我不知道如何使其正确

这里是过滤函数(我的猜测是这个函数的返回值是错误的):

cv::Mat createGaussianHighPassFilter(cv::Size size, double cutoffInPixels){

Mat ghpf(size, CV_64F);

cv::Point center(size.width / 2, size.height / 2);

for(int u = 0; u < ghpf.rows; u++)
{
    for(int v = 0; v < ghpf.cols; v++)
    {
        ghpf.at<double>(u, v) = gaussianCoeff(u - center.x, v - center.y, cutoffInPixels); //kernel utk gaussian filter yg 128x128
    }
}

return ghpf;

}

这是主要功能:

Mat mask = createGaussianHighPassFilter(complexI.size(),16);
shift(mask); 
Mat AX[] = {Mat::zeros(complexI.size(), CV_32F), Mat::zeros(complexI.size(), CV_32F)};
Mat kernel_spec;
AX[0] = mask; // real
AX[1] = mask; // imaginar
  merge(AX, 2, kernel_spec);

cout<<complexI.type()<<endl<<kernel_spec.type(); //the result is 13 and 14, the type doesn't match

mulSpectrums(complexI, kernel_spec, complexI, DFT_ROWS); // only DFT_ROWS accepted

updateMag(complexI);        // show spectrum
updateResult(complexI);     // do inverse transform

1 个答案:

答案 0 :(得分:1)

当然,他们不匹配。您正在将kernel_spec初始化为CV_32,但complexICV_64。做一个Mat::convertTo()它应该有效。

HTH