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

fourier transform gaussian filter error

本文关键字:误差 滤波器 高斯 变换 傅里叶      更新时间:2023-10-16

我是openCV的新手,我正在尝试使用频域中的高斯滤波器过滤图像。但是存在运行时错误"assertion failed (type == srcB.type() && srcA.size() == srcB.size()) in cv::mulSpectrum"我知道这是由我的过滤器的返回类型引起的,类型不匹配,我不知道如何正确

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

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
当然,

它们不匹配。您正在将kernel_spec初始化为 CV_32complexI CV_64 。做一个Mat::convertTo(),它应该可以工作。