1

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

编辑:

这是我尝试过的,但是频谱的象限不是按顺序排列的,因此频谱的原点不是图像的中心。这让我很难确定要抑制的频率。当交换象限以使原点为中心时,逆 DFT 显示错误的结果。谁能告诉我如何用交换的象限做逆 dft?

我不明白频率图像 filter1 和 filter2 中的列数(参见代码)。如果我在 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);
4

0 回答 0