Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对图像频谱应用陷波滤波器(OpenCV) 如何使用OpenCV 2.4和C++在图像频谱上应用陷波滤波器?我想计算图像的DFT,抑制某些频率并计算逆DFT。谁能给我看一些示例代码如何在频域中应用陷波滤波器_C++_Opencv_Filter_Dft_Spectrum - Fatal编程技术网

对图像频谱应用陷波滤波器(OpenCV) 如何使用OpenCV 2.4和C++在图像频谱上应用陷波滤波器?我想计算图像的DFT,抑制某些频率并计算逆DFT。谁能给我看一些示例代码如何在频域中应用陷波滤波器

对图像频谱应用陷波滤波器(OpenCV) 如何使用OpenCV 2.4和C++在图像频谱上应用陷波滤波器?我想计算图像的DFT,抑制某些频率并计算逆DFT。谁能给我看一些示例代码如何在频域中应用陷波滤波器,c++,opencv,filter,dft,spectrum,C++,Opencv,Filter,Dft,Spectrum,编辑: 这是我试过的,但是频谱的象限不整齐,所以频谱的原点不是图像的中心。这使得我很难确定要抑制的频率。当交换象限以原点为中心时,反向DFT显示错误的结果。有人能告诉我如何用交换的象限进行逆dft吗 我不明白频率图像过滤器1和过滤器2中的列数参见代码。如果在for循环中使用filter1.cols作为u,则无法访问图像的右边框。Filter1和filter2似乎有大约5000列,但源图像的分辨率为1280x1024灰度。有什么想法吗 对我的代码有进一步的评论吗 Mat img; img=

编辑:

这是我试过的,但是频谱的象限不整齐,所以频谱的原点不是图像的中心。这使得我很难确定要抑制的频率。当交换象限以原点为中心时,反向DFT显示错误的结果。有人能告诉我如何用交换的象限进行逆dft吗

我不明白频率图像过滤器1和过滤器2中的列数参见代码。如果在for循环中使用filter1.cols作为u,则无法访问图像的右边框。Filter1和filter2似乎有大约5000列,但源图像的分辨率为1280x1024灰度。有什么想法吗

对我的代码有进一步的评论吗

    Mat img;
img=imread(filename,CV_LOAD_IMAGE_GRAYSCALE);

int M = getOptimalDFTSize( img.rows );
int N = getOptimalDFTSize( img.cols );
Mat padded;
copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));

Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexImg;
merge(planes, 2, complexImg);

dft(complexImg, complexImg,cv::DFT_SCALE|cv::DFT_COMPLEX_OUTPUT);

   split(complexImg, planes);

Mat filter1;
planes[0].copyTo(filter1);
Mat filter2;
planes[1].copyTo(filter2);

for( int i = 0; i < filter1.rows; ++i)
{
    for(int u=7;u<15;++u)
    {
        filter1.at<uchar>(i,u)=0;
        filter2.at<uchar>(i,u)=0;
    }


Mat inverse[] = {filter1,filter2};
Mat filterspec;
merge(inverse, 2, filterspec);

cv::Mat inverseTransform;
cv::dft(filterspec, inverseTransform,cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);

cv::Mat finalImage;
inverseTransform.convertTo(finalImage, CV_8U);

我使用dft计算光谱,并尝试使用多光谱将图像的光谱与填充有1的矩阵相乘,除了一行填充有0。如何计算图像的dft,并将光谱的一行设置为零,然后进行逆dft?如果可能的话,我想使用频谱的形式,其中原点是切换象限后的中心,因此更容易确定哪一行必须为零。这是一个坏主意-请参阅DSP.SE,它可能也是一个更适合您提问的站点谢谢,但我还是想尝试一下……你需要知道,频域中的归零仓在空间域中会产生严重的伪影——如果你要这样做,你需要在频域中应用一个窗口函数,以便获得平滑的过渡——这将有助于减少这些伪影。你能发布一些示例代码如何修改频率分量,然后如何计算逆dft?