在图像光谱上应用陷波滤波器(OpenCV)

时间:2012-12-10 19:40:26

标签: c++ opencv filter dft spectrum

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

编辑:

这是我尝试过的,但是频谱的象限不是有序的,因此光谱的原点不是图像的中心。这使得我难以确定要抑制的频率。交换象限以使原点为中心时,反向DFT显示错误的结果。任何人都可以告诉我如何使用交换的象限进行逆dft吗?

我不了解频率图像filter1和filter2中的列数(请参阅代码)。如果我在for循环中使用filter1.cols作为你,我不会访问图像的右边框。 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);

0 个答案:

没有答案